Библиотека обещает передать значение в метод done

Я пытаюсь найти цель, а также как использовать готовый метод из обещаний библиотеки q, если done может получить значение или функцию через resolve или же rejectМожет кто-нибудь объяснить, как done метод вызывается и как передать ему любые аргументы?

Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
    // Do something with value4
})
.catch(function (error) {
    // Handle any error from all above steps
})
.done();

2 ответа

Решение

В обещаниях, с чем бы вы ни решили свою отсрочку, это аргумент, который передается done или же then, Вы можете изменить значение разрешения внутри разрешенного обработчика, возвращая другое значение. Вот так

Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
  // Do something with value4
  return 'tada!';
})
.catch(function (error) {
    // Handle any error from all above steps
})
.done(function(differentValue) {
  console.log(differentValue); // outputs "tada!"
});

Фактическая цель .done в Q - обрабатывать ошибки, чтобы ошибки не подавлялись.

Если у вас есть цепочка отклоненных обещаний в Q, если вы используете .then все это становится тихим отказом, поэтому следующий код:

Q().then(function(){
    var val = JSON.prase(data);
    someEffectWith(val);
});

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

Q().done(function(){
    var val = JSON.prase(data);
    someEffectWith(val);
});

Или же:

Q().then(function(){
    var val = JSON.prase(data);
    someEffectWith(val);
}).done();

Оба выдают большое красное предупреждение на вашу консоль, уведомляющее вас об ошибке. Что касается того, как это называется, он имеет точно такие же аргументы .then только он не возвращает обещание, а возвращает undefined так что вы знаете, что вы не можете связать его (это оборвало цепочку).

Стоит упомянуть некоторые библиотеки обещаний, а также встроенные обещания в Firefox делают это для вас, и вам не нужно использовать .done в этих библиотеках - ошибка будет записана независимо.

Другие вопросы по тегам