Все ли в цепочке обещаний должно быть обещанием? - PullRequest
0 голосов
/ 17 января 2020

Это упрощенный пример моего реального кода, но я пытаюсь убедиться, что это верно. Мой вопрос касается второго пункта в цепочке обещаний ниже.

// vars photo and image are declared outside of the promise chain

// ...
.then(() => Photo.create()) // this is a promise
.then(p => photo = p) // this is just assigning a variable, no promise
.then(() => image.resize({ height: 240 }).toBuffer()) // this is another promise
// ...

Это работает, но это хороший способ справиться с этим? Причина, по которой я организовал это так, заключается в том, что у меня есть промежуточный этап, на котором мне нужно выполнить некоторые задания и расчеты и т. Д. c, и просто организационно я хочу отделить его от других моих .then() разделов, которые являются реальными обещаниями. .

1 Ответ

1 голос
/ 17 января 2020

Должно ли все в цепочке обещаний быть обещанием?

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

Но, кроме этого, нет. Элементы в цепочке .then() не должны использовать обещания или возвращать обещания. Вы можете запустить любой Javascript. Для следующей ссылки в цепочке важно возвращаемое значение из обработчика .then().

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

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


Но если в обработчике .then() нет ничего асинхронного, то вы можете просто объединить его с предыдущим или следующим звеном цепочки и устранить тот обработчик .then(), который упрощает вещи.

Например, эта цепочка:

then(() => Photo.create()) // this is a promise
.then(p => photo = p) // this is just assigning a variable, no promise
.then(() => image.resize({ height: 240 }).toBuffer()) // this is another promise
// ...

может быть уменьшена до этого:

then(() => Photo.create()) // this is a promise
.then(p => {photo = p; return image.resize({ height: 240 }).toBuffer()}) // this is another promise
// ...

FYI, ваш конкретный пример c здесь не ' даже в действительности не нужно быть цепочкой, потому что image.resize() не использует результат Photo.create(), поэтому, если это не просто артефакт того, что вы составляете некоторый код для публикации, эти две операции могут выполняться параллельно и не должны быть прикованы Цепочки обещаний предназначены для ситуаций, когда операции должны быть упорядочены, часто вывод одного шага является частью ввода следующего шага.

...