Должно ли все в цепочке обещаний быть обещанием?
Ну, вы должны начать с обещания во главе цепочки, потому что в противном случае у вас нет затем можно позвонить .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()
, поэтому, если это не просто артефакт того, что вы составляете некоторый код для публикации, эти две операции могут выполняться параллельно и не должны быть прикованы Цепочки обещаний предназначены для ситуаций, когда операции должны быть упорядочены, часто вывод одного шага является частью ввода следующего шага.