Что `x = x.then()` делает в обещаниях?
Я пытаюсь понять некоторый код, который имеет новый подход к обещаниям:
var sequence = Promise.resolve();
sequence = sequence.then(
function() {
// success function
}
);
sequence = sequence.then(
function(keyPair) {
// success function
},
function(err) {
// err function
}
);
sequence = sequence.then(
function(keyPair) {
// success function
},
function(err) {
// err function
}
);
Чем это отличается от обычной цепочки .then
подход? Это безопасно для использования?
2 ответа
Чем это отличается от обычной цепочки
.then
подход?
Не за что. Вы можете устранить это sequence
переменная и цепочка .then()
вызов метода напрямую, и вы получите точно такое же поведение из своих обещаний.
Это безопасно для использования?
Да.
Зачем мне это использовать?
Обычно вы не должны. Это (по-видимому) просто сбивает с толку, в этом нет необходимости sequence
переменная, и это просто дольше. Создание переменных с описательными именами может сделать код более многословным и более простым для понимания, но sequence
просто бессмысленно.
Однако есть одно преимущество: вы можете создавать динамические цепочки. Вы можете поместить некоторые из этих заданий в if
блокировать или даже использовать циклы для построения цепочек обещаний переменной длины и поведения. Благодаря синхронной оценке условий перед выполнением обратных вызовов обещания это может быть даже полезно для производительности (хотя и создает большее количество объектов обещаний в памяти) по сравнению с помещением всего потока управления в обратные вызовы обещания. Независимо от этого, для такого подхода следует использовать разные и описательные переменные, вместо того, чтобы повторно назначать одну и ту же переменную.
Это безопасно для использования. Это эквивалентно сцеплению, но с явным переназначением обещания, возвращенного then
функция.
Другими словами, это так же, как если бы оно было написано
sequence = sequence.then(
function() {
// success function
}
).then(
function(keyPair) {
// success function
},
function(err) {
// err function
}
).then(
function(keyPair) {
// success function
},
function(err) {
// err function
}
);