Bluebird, promises и затем()
Я использую только синюю птицу в течение нескольких дней, но я хочу пройти весь свой старый код и promisify
it:)
Моя проблема в том, что я до сих пор не полностью понимаю поток команд then()
.
Рассмотрим эти два блока:
А
methodThatReturnsAPromise().then(task2).then(task3);
В
var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
-
в сценарии A task3
будет получен результат task2
? В B все они получают результат первого обещания?
-
Как второй отличается от запуска Promise.all
от синей птицы?
-
Как эти A/B/ Promise.all
отличаются друг от друга, когда дело доходит до использования метода catch
(где я его помещаю).
Извините, это куча вопросов в одном.
Ответы
Ответ 1
Добро пожаловать в чудесный мир promises.
Как then
работает в вашем примере
Ваше утверждение в 1
верное. Мы можем моделировать решение обещаний в Bluebird, используя Promise.resolve
для значения.
Покажем это:
Позвольте получить функцию, которая возвращает обещание:
function foo(){
return Promise.resolve("Value");
}
foo().then(alert);
Этот короткий фрагмент будет предупреждать "Value"
как который мы видим.
Теперь давайте создадим еще два promises, каждый из которых предупреждает и возвращает разные значения.
function task2(e){
alert("In two got " + e);
return " Two ";
}
function task3(e){
alert("In three got " + e);
return " Three ";
}
Итак, как вы можете видеть в ваш первый код, он действительно разрешит цепочку, каждая со значением предыдущей части.
Во втором примере обе задачи2 и task3 получат одинаковое значение и будут выполняться вместе (то есть задача 3 не будет ждать задачи 2). Вы можете увидеть, что здесь.
Promise.all
Promise.all(или просто возврат массива из обработчика выполнения then
, а затем с помощью .spread
) используется для ожидания полного завершения нескольких результатов. На вашем примере вы подключаетесь к одному результату в нескольких частях.
Ловушка
Вы всегда ставите catch, где хотите, чтобы ошибка была поймана. Как обычно, в синхронном коде. Просто помните, чтобы всегда бросать обещание или в обещанный код.
Ответ 2
в сценарии Задача3 получит результат task2? В B все они получают результат первого обещания?
Да.
Как второй отличается от запуска Promise.all от bluebird?
Вы не получаете результаты (параллельные) задачи 2 и 3 в новое обещание.
Как эти A/B/Promise.all отличаются, когда дело доходит до использования метода catch (где я его помещаю).
Обычно вы помещаете его в конец цепочки, за исключением того, что хотите поймать определенную ошибку.
promise.catch()
// handles rejections of this promise
promise.then(task2).catch()
// handles rejections from either promise or task2
// if promise is rejected, task2 will not be executed
Promise.all(promise.then(task2), promise.then(task3)).catch()
// handles rejections from any.
// if promise is rejected, neither task2 nor task3 will be executed
// if task2 or task3 throw, the error will immediately handled
// and the other task will not be affected (but its result is unavailable)
Ответ 3
Вы не получаете один простой принцип цепочка
Вначале можно написать как
var promise = methodThatReturnsAPromise(),
promise1 = promise.then(task2);
promise1.then(task3);
Во втором случае
var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
Надеемся, что это объяснит разницу b/w двух