2017-01-10 34 views
5

Używam Bluebird do obietnic i staram się zezwolić na wywoływanie łańcucha, jednak użycie .bind() nie działa. Dostaję:Bluebird Promise Bind Chain

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

Pierwsza metoda nazywa się prawidłowo i uruchamia łańcuch obietnica ale miałaś w stanie uzyskać pracę wiążącą instancji w ogóle.

To jest mój kodu testu:

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

używam najnowszego Bluebird poprzez:

npm install --save bluebird

jestem zbliża to źle? Byłbym wdzięczny za każdą pomoc. Dzięki.

Odpowiedz

2

jest wyrzucanie tego błędu, ponieważ nie istnieje metoda testSecond na testFirst, jeśli chcesz zrobić coś po obu obietnice zostaną rozwiązane, zrób to jak poniżej:

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

Jeśli chcesz sprawdzić, czy oba są rozwiązane poprawnie, zamiast robić console.log powrócić ciąg w testFirst i testSecond funkcji i rejestrować je w spread zwrotnego jak pokazano poniżej:

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

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

Teraz robi console.log w spread zwrotnego jak pokazano poniżej, będzie zalogować sznurki zwrócony przez obietnic powyżej:

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

Moim założeniem było to, że istnieje tylko jedna obietnica zbudowany przez ready(), a następnie każdy test() funkcja jest po prostu kolejnym łańcuchem then() w obietnicy, która nadal dziedziczy obiekt SampleObject w przypadku większej liczby połączeń łańcuchowych. Czy to jest możliwe? – Pat841

+0

Nie, za każdym razem, gdy wywołujesz 'ready()' tworzy nową obietnicę, możesz połączyć każdą z tych obietnic za pomocą '.then()'. I tak, każda funkcja testowa jest kolejnym łańcuchem, ale musisz ją odnieść w odniesieniu do następnej, tak jak zrobiłem to w mojej odpowiedzi. – superUser

+0

Ale ready() jest wywoływane tylko raz, wewnątrz konstruktora obiektów, który zwraca obietnicę. Każda funkcja testowa używa wtedy() za pośrednictwem już utworzonej obietnicy. – Pat841