Может быть, я не понимаю, как работает Promise.promisifyAll
. Я пытаюсь обещать пакет coinbase.
По сути, клиентские функции обещаны, но аккаунты, возвращаемые этими функциями, не имеют асинхронной версии: [TypeError: acc.getTransactionsAsync is not a function]
.
Я попытался передать {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);
});
});
});
});
Обещанная версия не работает (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);
});
ИЗМЕНИТЬ:
Просматривая пакет, который я хочу обещать, я понял, что функции, которые я пытаюсь вызвать, взяты из объектов модели, возвращаемых пакетом. Думаю 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
должен, как и ожидалось, со свойствами объекта без вмешательства предыдущего редактирования. На данный момент я думаю, что не может быть другого варианта, кроме как создавать свои собственные промисы для всех функций, которые мне понадобятся, которые не находятся непосредственно под клиентом.
new Promise(...)
функций, но пока не могу найти другого способа решить эту проблему. - person Fdo   schedule 20.04.2016