2016-04-20 11 views
0

多分、私はPromise.promisifyAllの仕組みを理解していません。私はcoinbaseパッケージを約束しようとしています。Bluebird promisifyすべて非同期関数のセット全体を作成しない

基本的にクライアントの機能は約束されていますが、これらの機能から返されるアカウントにはAsyncバージョン:[TypeError: acc.getTransactionsAsync is not a function]が含まれていません。

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); 
}); 

EDIT:

私が約束したいパッケージを見てみると、私が呼び出しようとしているのは、パッケージによって返されたモデルオブジェクトです。私は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 
}; 

EDIT 2である:それはクライアントが必要と

そのモデルのモジュールであるので、Promise.promisifyAllは、以前の編集を妨げずにオブジェクトのプロパティを期待どおりにする必要があります。この時点では、私が必要とするすべての機能に対して自分の約束をするという選択肢はないでしょう。クライアント。

+0

私はたくさんの 'new Promise(...)'関数を作成しないようにしようとしていますが、これまでにこの問題を解決する方法は他にありません。 – Fdo

答えて

3

私はpromisifyAllが唯一のクライアント機能を解析し、モデルが処理されていないと思います。

正確ではありません。これは、方法とプロパティを調べる方法とは何も関係ありません。promisifyAllむしろ、明示的promisifiedするためにのみ、クライアント・メソッドを渡している。

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

clientからモデルへのリンクがありません。 、

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

や問題が解決しない場合はClientクラスとクラスのmodelsコレクションの両方にコールpromisifyAll

はむしろClientクラスだけでなく、モジュール全体にpromisifyAllを呼び出そう
var coinbase = require('coinbase'); 
var Client = Promise.promisifyAll(coinbase.Client); 
Promise.promisifyAll(coinbase.model); 
+0

それはどちらもうまくいきませんでした。私が電話をしていた元の方法でした。答え/示唆の後、私はそれをこの方法に変更しましたが、彼は彼の答えを削除し、私は彼が私の質問を落とした人であると判断しました。クライアントの中には、プロパティとしてモデルが必要なので、それらを約束する必要があります(ただしそうではありません)。** EDIT 2 **を参照してください。私は別の大きなファイルをコピー&ペーストしたくなかったが、問題はすでに長すぎる。 – Fdo

+0

いいえ、 'client.js'ファイルのいくつかが' modules/... 'ファイルを必要としているからといって、それらがpromisifiedになるわけではありません。 'Client'や' Client.prototype'から*プロパティ*として到達可能なクラスのみを宣言します。 – Bergi

+0

ああ、 'promisifyAll'はクラスではないので(大文字の名前などはないので)、' coinbase.models'に深く入るとは考えていません。 – Bergi

0

質問をもう一度編集するのではなく、一時的な回避策を追加しています(わずかに異なる関数呼び出しがありますが、それにはAsync関数がないという同じ問題があります)。これにより、モデルモジュールは独自のものであると約束しています。私は、クライアントから返されたモデルの約束されていないバージョンに対して、promisified関数が必要なときに、必要に応じてモデルモジュールを作成する必要があります。

promisified関数呼び出しをしたいそれぞれのモデルにもっと多くのメモリ割り当てが必要なので、私がやりたいことではありません。しかし、私はnew Promise(...)の機能をグループ化するための新しいモジュールを作成する以上にこのアプローチを好む。

もっと良い解決策が提案されていれば、私はまだそれを解決したものとしてマークします。

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

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); 
Promise.promisifyAll(cbModel); 

//Promises 
client.getAccountAsync('primary') 
.then(function(account) { 
    account = new cbModel.Account(client, account); 
    return account.getTransactionsAsync(null); 
}) 
.then(function(transactions) { 
    console.log('Transactions:'); 
    transactions.forEach(function(tx) { 
    console.log(tx.id); 
    }); 
}) 
.catch(function(err) { 
    console.log(err); 
}); 
関連する問題