承诺链中的所有内容都必须是一个承诺吗?

问题描述 投票:0回答:1

这是我的实际代码的简化示例,但是我试图确保这是有效的。我的问题是关于下面的承诺链中的第二项。

// 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
// ...

它有效,但这是处理此问题的好方法吗?之所以这样组织它,是因为我基本上有一个中间步骤,需要做一些赋值和计算等工作,只是在组织上,我想将其与实际的其他.then()部分分开。

javascript express promise sequelize.js chaining
1个回答
0
投票

诺言链中的所有内容都必须是诺言吗?

嗯,您必须从链的最前面开始一个诺言,因为否则您将没有一个可召唤的.then()

但是,除此之外,没有。 .then()链中的项目不必使用承诺或返回承诺。您可以运行任何Javascript。对于链中下一个链接,重要的是.then()处理程序的返回值。

如果.then()处理程序的返回值是纯值(不涉及承诺),则该值将传递到下一个.then()处理程序。

如果.then()处理程序的返回值是一个promise,则该promise的解析值将传递到下一个.then()处理程序,并且在实现该promise之前,promise链不会前进。


但是,如果在链接的.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,您在这里的特定示例甚至不需要链接,因为image.resize()没有使用Photo.create()的结果,因此除非这只是您要编写一些代码的工件,否则这两个操作可以并行运行,而不必链接在一起。承诺链适用于必须对操作进行排序的情况,通常一步的输出是下一步输入的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.