Библиотека обещает передать значение в метод 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
в этих библиотеках - ошибка будет записана независимо.