[英]Order of operations after promises
我对 JavaScript(使用 Node.js)还很陌生,还在学习。 我试图用承诺环绕我的头,但我遇到了这种情况,我不明白这段代码之间是否有区别:
promiseFunc().then(() => {
anotherPromiseFunc() // I dont need .then() here, just want to save some data to DB
});
doSmthElse()
这个代码:
promiseFunc().then(async () => {
await anotherPromiseFunc() // I dont need .then() here, just want to save some data to DB
});
doSmthElse()
如果我在第一种情况下不使用 .then( .then()
,是否意味着doSmthElse()
anotherPromiseFunc()
可能在 anotherPromiseFunc() 执行之前执行? 所以为了防止这种情况,我必须添加async
/ await
? 或者.then()
块中的所有代码在执行其他操作之前都在等待执行?
注意 1:我不想链接这些承诺,因为在我的案例中有更多代码,但我只是在这里简化了它。
注意2:我不使用catch,因为如果错误会发生,我会在稍后捕获它。
如果我在第一种情况下不使用 .then(
.then()
,是否意味着doSmthElse()
有可能在 AnotherPromise(AnotherPromise()
执行之前执行?
doSmthElse()
保证在执行处理程序中的任何内容执行之前执行。 Promise 履行和拒绝处理程序总是异步调用。 无论您是否使用async
声明处理程序 function 都是如此。
例如:
console.log("before"); Promise.resolve(42).then(result => { console.log("within", result); }); console.log("after");
其 output 为:
before after within 42
所以为了防止这种情况,我必须添加
async
/await
?
当执行doSmthElse()
时,您在示例中添加async
/ await
的位置不会改变。
如果您希望doSmthElse()
等到 promise 已完成,请将其移动到完成处理程序中。¹
如果您的代码在async
function 中,则可以使用await
代替,如下所示:
// Inside an `async` function
await promiseFunc().then(() => {
anotherPromiseFunc();
});
doSmthElse()
那会这样做:
promiseFunc()
并获取它返回的 promisethen
将一个履行处理程序连接到该 promise,返回一个新的 promise; 新的 promise 是await
的操作数anothterPromiseFunc()
但不等待它返回的 promise 解决(因为,正如您所说,您没有从履行处理程序返回 promise)。undefined
,这不是一个thenable (松散地,一个承诺),因此该值( undefined
)用于实现来自 #2 的 promise .await
并执行doSmthElse()
。 ¹您传递的then
作为其第一个参数
我假设Promise()
只代表一些 function 调用返回 Promise:
您可以这样说。然后注册一个事件侦听器,该侦听器在 promise 稳定后立即运行 => 任务完成。 它仍然异步运行因此在您的示例中,即使 promise 尚未解决, doSmthElse
仍将运行(因此,如果 promise 未立即解决, doSmthElse
将在 ZC1C425264E68385D1ABZA4 内部调用之前调用)。
让您的代码“按顺序”运行。 您必须使用await
来确保在doSmthElse
解决之后调用 doSmthElse,或者您可以将doSmthElse
放入 .then 块中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.