Подтвердить что ты не робот

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 (где я его помещаю).

Извините, это куча вопросов в одном.

4b9b3361

Ответ 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 двух