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