2017-01-10 5 views
5

Ich benutze Bluebird für Versprechungen und versuchen, Chain-Calling jedoch mit .bind() scheint nicht zu funktionieren. Ich erhalte:Bluebird Promise Bind Chain

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

Die erste Methode korrekt aufgerufen wird, und startet die Versprechen Kette, aber ich habe überhaupt die Instanz verbindlich Arbeit bekommen kann.

Dies ist mein Testcode:

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

Ich bin mit der neuesten drossel über:

npm install --save bluebird

Bin ich das falsch nähern? Ich würde jede Hilfe schätzen. Vielen Dank.

Antwort

2

es, dass Fehler wirft, weil es keine Methode testSecond auf testFirst ist, wenn Sie etwas, nachdem sowohl die Versprechen gelöst werden tun wollen, tun Sie es wie unten:

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

Wenn Sie, wenn überprüfen möchten beide sind richtig aufgelöst, stattdessen eine console.log zu tun, die Zeichenfolge in testFirst und testSecond Funktionen geben und sie im spread Rückruf log wie unten dargestellt:

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

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

Nun tut ein console.log im spread Rückruf, wie unten dargestellt, werden die Fäden von den Versprechungen oben zurück log:

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

Meine Vermutung war, dass es nur ein einziges Versprechen über fertig gebaut ist() dann jeder Test() Funktion ist nur eine weitere then() - Kette in der Zusage, die das SampleObject für mehr verkettete Aufrufe weiter erbt. Ist das möglich? – Pat841

+0

Nein, jedes Mal, wenn Sie 'ready()' aufrufen, wird ein neues Versprechen erstellt, Sie können jedes dieser Versprechen mit '.then()' verketten. Und ja, jede Testfunktion ist eine andere Kette, aber Sie müssen sie in Bezug auf den nächsten beziehen, wie ich es in meiner Antwort getan habe. – superUser

+0

Aber ready() wird nur einmal innerhalb des Objektkonstruktors aufgerufen, der das Versprechen zurückgibt. Jede Testfunktion verwendet dann() über das bereits erstellte Promise. – Pat841