也许我不理解 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/