2017-01-10 16 views
5

Я использую Bluebird для обещаний и пытается разрешить цепочку, но использование .bind() похоже не работает. Я получаю:Bluebird Promise Bind Chain

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

Первый метод называется правильно и начинает обещание цепи, но я гавань была в состоянии получить экземпляр связывания работу на всех.

Это мой тестовый код:

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

Я использую последнюю Bluebird через:

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, возвращает строку в testFirst и testSecond функций и зарегистрировать их в 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 для более цепных вызовов. Это возможно? – Pat841

+0

Нет, каждый раз, когда вы вызываете 'ready()', создается новое обещание, вы можете связать каждое из этих обещаний с помощью '.then()'. И да, каждая тестовая функция - это еще одна цепочка, но вы должны отнести ее к следующему, как я сделал в своем ответе. – superUser

+0

Но ready() вызывается только один раз, внутри конструктора объектов, который возвращает обещание. Каждая тестовая функция использует then() через уже созданное Promise. – Pat841