这是我的实际代码的简化示例,但是我试图确保这是有效的。我的问题是关于下面的承诺链中的第二项。
// 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()
部分分开。
诺言链中的所有内容都必须是诺言吗?
嗯,您必须从链的最前面开始一个诺言,因为否则您将没有一个可召唤的.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()
的结果,因此除非这只是您要编写一些代码的工件,否则这两个操作可以并行运行,而不必链接在一起。承诺链适用于必须对操作进行排序的情况,通常一步的输出是下一步输入的一部分。