bluebird - обещание при връщане на друго обещание

Опитвам се да накарам този код да изпълни console.logs в ред (test1, test2, test3). Сега е тест1, тест3, тест2. Очаквах, че вторият then() ще изчака функцията resolve(), преди да започне, но не работи :)

var bluebird = require('bluebird');

var promise = bluebird.resolve(true);
promise.then(function() {
  return new bluebird(function(resolve, reject) {
    console.log("test1");

    setTimeout(function() {
      console.log("test2");
      resolve();
    }, 3000);
  });
});

promise.then(function() {
  console.log("test3");
});

http://requirebin.com/?gist=7ba0a8500400bfa7fd22


person maxgalbu    schedule 13.11.2015    source източник
comment
Искате promise.then(…).then(…) - не извиквайте втория then() на самия promise отново, а по-скоро на върнатата стойност на първия.   -  person Bergi    schedule 13.11.2015


Отговори (1)


Обещанията са неизменни. Те излъчват своята стойност. След като едно обещание се разреши със стойност, то ще има тази стойност завинаги.

var p = Promise.resolve(3);
p.then(() => console.log(1));
p.then(() => console.log(2));

В горния пример и двете ще се изпълнят след разрешаване на p и няма да чакат една друга. Това има смисъл, защото обещанията са неизменни.

Можете да промените препратката към обещанието, тъй като then връща ново обещание:

promise = promise.then(...
person Benjamin Gruenbaum    schedule 13.11.2015
comment
връщайки се към това, това е правилното решение, но ще трябва да напиша .catch() за всяко ново обещание, нали? - person maxgalbu; 04.12.2015
comment
Да, ако искате да обработвате грешки във всички случаи, бихте го направили. Ако нямате никаква смислена обработка на грешки, която да извършите, нямате. - person Benjamin Gruenbaum; 04.12.2015