2017-01-10 15 views
5

私は約束のためにBluebirdを使用していますが、チェーンコールを許可しようとしていますが、.bind()を使用しても動作しません。私は取得しています:Bluebird Promiseバインドチェーン

TypeError: sample.testFirst(...).testSecond is not a function

第1の方法が正しく呼び出さと約束チェーンを開始しますが、私は全くのインスタンス結合作業を取得することができたhaventはされています。

これは私のテストコードです:

var Promise = require('bluebird'); 

SampleObject = function() 
{ 
    this._ready = this.ready(); 
}; 

SampleObject.prototype.ready = function() 
{ 
    return new Promise(function(resolve) 
    { 
    resolve(); 
    }).bind(this); 
} 

SampleObject.prototype.testFirst = function() 
{ 
    return this._ready.then(function() 
    { 
    console.log('test_first'); 
    }); 
} 

SampleObject.prototype.testSecond = function() 
{ 
    return this._ready.then(function() 
    { 
    console.log('test_second'); 
    }); 
} 

var sample = new SampleObject(); 
sample.testFirst().testSecond().then(function() 
{ 
    console.log('done'); 
}); 

私は経由で最新の青い鳥を使用しています:

npm install --save bluebird

私はこの間違ったに近づいていますか?助けていただければ幸いです。ありがとう。

答えて

2

、何の方法testSecondありませんので、あなたが約束の両方が解決された後に何かをしたい場合はそれは、testFirstにそのエラーを投げているが、以下のようにそれを行う:あなたがいるかどうかを確認したい場合は

var sample = new SampleObject(); 

Promise.join(sample.testFirst(), sample.testSecond()).spread(function (testFirst, testSecond){ 
    // Here testFirst is returned by resolving the promise created by `sample.testFirst` and 
    // testSecond is returned by resolving the promise created by `sample.testSecond` 
}); 

両方は、適切に解決代わりにconsole.logを行うための、testFirsttestSecond関数で文字列を返すと、以下のようにspreadコールバックでそれらをログに記録されています

SampleObject.prototype.testFirst = function() 
{ 
    return this._ready.then(function() 
    { 
    return 'test_first'; 
    }); 
} 

SampleObject.prototype.testSecond = function() 
{ 
    return this._ready.then(function() 
    { 
    return 'test_second'; 
    }); 
} 

は今、以下に示すように、spreadコールバックでconsole.logを行う上での約束によって返された文字列をログに記録します。

Promise.join(sample.testFirst(), sample.testSecond()).spread(function(first, second){ 
    console.log(first); // test_first 
    console.log(second); // test_second 
}); 
+0

私の仮定は、各テスト()(準備を経て構築された唯一の約束があるということでした)関数は、より多くの連鎖呼び出しのためにSampleObjectを継承し続けているpromiseのちょうどanother()連鎖です。それは可能ですか? – Pat841

+0

いいえ、 'ready()'を呼び出すたびに新しい約束事が作成されます。それらの約束事を '.then()'で連鎖させることができます。そして、はい、それぞれのテスト関数は別のチェーンですが、あなたは私の答えでやったように、次にそれを参照する必要があります。 – superUser

+0

しかし、ready()は、約束を返すオブジェクトコンストラクタ内で1回しか呼び出されていません。各テスト関数は、既に作成されたPromiseを介してthen()を使用します。 – Pat841

関連する問題