javascript - Bluebird promisifyAll 未创建整套异步函数

标签 javascript node.js promise bluebird coinbase-api

也许我不理解 Promise.promisifyAll 的工作方式。我试图 promise coinbase包。

基本上,客户端的函数是 promise 的,但这些函数返回的帐户似乎没有异步版本:[TypeError:acc.getTransactionsAsync不是函数]

我尝试按照 an answer to a similar question 中的建议将 {multiArgs:true} 作为选项传递给 Promise.promisifyAll() ,但并没有解决问题。如有任何建议,我们将不胜感激。

使用该包的正常方式(有效):

var Client = require('coinbase').Client

var client = new Client({
  'apiKey': '<snip>',
  'apiSecret': '<snip>',
  'baseApiUri': 'https://api.sandbox.coinbase.com/v2/',
  'tokenUri': 'https://api.sandbox.coinbase.com/oauth/token'
});

//Callbacks
client.getAccounts({}, function(err, accounts) {
  accounts.forEach(function(acc) {
    acc.getTransactions(null, function(err, txns) {
      txns.forEach(function(txn) {
        console.log('txn: ' + txn.id);
      });
    });
  });
});

Promisified 版本不起作用(getTransactionsAsync 未定义,但 getAccountsAsync 返回正确的帐户):

var Promise = require('bluebird');
var Client = require('coinbase').Client;

var client = new Client({
  'apiKey': '<snip>',
  'apiSecret': '<snip>',
  'baseApiUri': 'https://api.sandbox.coinbase.com/v2/',
  'tokenUri': 'https://api.sandbox.coinbase.com/oauth/token'
});

Promise.promisifyAll(client);

//Promises
client.getAccountsAsync({}) //Works perfectly, returns the accounts
.then(function(accounts) {
  return Promise.map(accounts, function(acc) {
    return acc.getTransactionsAsync(null); //This function call is throwing the TypeError
  });
})
.then(function(transactions) {
  console.log('Transactions:');
  transactions.forEach(function(tx) {
    console.log(tx);
  });
})
.catch(function(err) {
  console.log(err);
});

编辑:

查看我想要 promise 的包,我意识到我尝试调用的函数来自包返回的模型对象。我认为 promisifyAll 只解析客户端函数,并且模型没有被处理。我只是不太熟悉如何进行解析:(

这是index.js(导出的模块)

var Account       = require('./lib/model/Account.js'),
    Address       = require('./lib/model/Address.js'),
    Buy           = require('./lib/model/Buy.js'),
    Checkout      = require('./lib/model/Checkout.js'),
    Client        = require('./lib/Client.js'),
    Deposit       = require('./lib/model/Deposit.js'),
    Merchant      = require('./lib/model/Merchant.js'),
    Notification  = require('./lib/model/Notification.js'),
    Order         = require('./lib/model/Order.js'),
    PaymentMethod = require('./lib/model/PaymentMethod.js'),
    Sell          = require('./lib/model/Sell.js'),
    Transaction   = require('./lib/model/Transaction.js'),
    User          = require('./lib/model/User.js'),
    Withdrawal    = require('./lib/model/Withdrawal.js');

var model = {
  'Account'       : Account,
  'Address'       : Address,
  'Buy'           : Buy,
  'Checkout'      : Checkout,
  'Deposit'       : Deposit,
  'Merchant'      : Merchant,
  'Notification'  : Notification,
  'Order'         : Order,
  'PaymentMethod' : PaymentMethod,
  'Sell'          : Sell,
  'Transaction'   : Transaction,
  'User'          : User,
  'Withdrawal'    : Withdrawal
};

module.exports = {
  'Client' : Client,
  'model'  : model
};

编辑2:

客户端需要它自己的模型模块,因此 Promise.promisifyAll 应符合对象属性的预期,而不会受到先前编辑的干扰。在这一点上,我认为可能没有其他选择可以为我需要的所有不直接位于客户端下的功能做出自己的 promise 。

最佳答案

I think promisifyAll only parses the client functions, and the models are not being processed.

不完全是。这与 promisifyAll 如何查看方法和属性无关。相反,您只显式传递要 promise 的客户端方法:

var Client = require('coinbase').Client;
var client = new Client(…);
Promise.promisifyAll(client);

没有从客户端到模型的链接。 而是尝试在整个模块上调用 promisifyAll,而不仅仅是 Client 类:

var Client = Promise.promisifyAll(require('coinbase')).Client;

或者如果这不起作用,Client 类和 models 类集合上调用 promisifyAll:

var coinbase = require('coinbase');
var Client = Promise.promisifyAll(coinbase.Client);
Promise.promisifyAll(coinbase.model);

关于javascript - Bluebird promisifyAll 未创建整套异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36739962/

相关文章:

javascript - 带有 node.js 的 http 请求在发送后无法设置 header

javascript - Promise.all - 尽管 Promise 被拒绝,但解决回调触发

javascript - 将绝对元素重新定位到右侧

javascript - Quora 在 Jquery Mobile 中样式化了 "add content"图标

javascript - 如何发布 Vue.js 组件库?

javascript - Selenium Webdriver JavaScript : Promise seems to not be resolved

node.js - 使用 bcrypt 来确保密码没有重复

javascript - 将类添加到存储在数组中的对象

javascript - 定义没有值的关联数组

.net - 如何将 .NET 代码连接到 node red 平台