Javascript 使用Async/Await澄清承诺顺序解决方案
我对Javascript相当陌生,希望在谈到如何解决承诺的顺序时,能对async/await做一点澄清 假设我有一个异步函数,我们称之为foo,它检索某些内容,然后使用fs.promises库将其写入文件Javascript 使用Async/Await澄清承诺顺序解决方案,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我对Javascript相当陌生,希望在谈到如何解决承诺的顺序时,能对async/await做一点澄清 假设我有一个异步函数,我们称之为foo,它检索某些内容,然后使用fs.promises库将其写入文件 const foo = async () => { const x = await getX(); fs.promises.writeFile(path, x); //do I need to await this?}; 我还有另一个异步函数,它将调用foo,然后在写入文件内容后对其进
const foo = async () => {
const x = await getX();
fs.promises.writeFile(path, x); //do I need to await this?};
我还有另一个异步函数,它将调用foo,然后在写入文件内容后对其进行处理——在网页上显示,进行计算,等等
const doSomething = async () => {
await foo(); //want to make sure foo resolves before calling otherFileFunc
otherFileFunc(); };
我希望确保在执行otherFileFunc之前,文件内容已写入,即writeFile的承诺已得到解决。在这里等待foo已经足够了,还是foo的承诺可以在writeFile的承诺解决之前解决?我应该在foo中等待writeFile以确保这一行为,还是foo的整个承诺解决依赖于writeFile解决的承诺,因此等待它是多余的
谢谢大家!
我是否应该在foo
中等待writeFile
以确保此行为
对
或者foo
的整个承诺解析依赖于writeFile
解析的承诺吗
否。async
函数的承诺解析仅取决于其主体的返回值。要使其依赖于另一个承诺,您必须等待
,以暂停异步
函数的执行。通过考虑返回被调用函数的结果(即使值是未定义的
,在您的情况下,隐含的结果是文件已完全写入),可以最容易地实现这一点-您只能在等待结果的情况下才能这样做
async function foo() {
const x = await getX();
await fs.promises.writeFile(path, x);
}
在执行async
函数的过程中,不存在对任何承诺的“隐式等待”。如果有,您a)无法执行类似于承诺的操作。如果您确实不想等待,则所有b)都无法执行任务。您在后台编写了一个文件,而foo
函数没有wait
语句,在文件完成编写之前就解决了它的承诺,这是不正确的
在这里等待foo已经足够了,还是foo的承诺可以在writeFile的承诺解决之前解决?我应该在foo中等待writeFile以确保这一行为,还是foo的整个承诺解决依赖于writeFile解决的承诺,因此等待它是多余的
foo
的承诺由foo
的代码控制。每个wait
都会让承诺等待另一个承诺。函数的承诺将在函数代码结束时解决
对于每个异步函数调用,通常等待
,以获取结果值或知道任务何时完成(如在同步编程中)
doSomething
将按预期工作,因为它将等待foo()
返回的承诺,而foo()返回的承诺将依次等待getX()
返回的承诺,然后等待fs.promises.writeFile()返回的承诺
p.S.
MDN对async/await有很好的了解,它涵盖了概念、与承诺的关联以及错误处理
const foo = async () => {
const x = await getX();
fs.promises.writeFile(path, x); // do I need to await this?
}
writeFile是一个异步函数,返回一个承诺
const doSomething = async () => {
await foo(); //
otherFileFunc(); };
将在未完成writeFile的情况下调用otherFileFunc()
解决方案:
const foo = async () => {
const x = await getX();
return fs.promises.writeFile(path, x); // do I need to await this?
}
现在,writeFile本身返回一个承诺,由foo()返回。因为foo()现在从writeFile返回承诺,await foo()
按预期工作
所以,在我看来,你的第二个答案是正确的
foo的整个承诺决议取决于
writeFile解析并因此等待它是多余的吗
你需要等待它。它回报了一个承诺,很有意义。谢谢你的解释,我真的很感激。另外,我现在实际上不必等待foo现在做什么,对吗?因为我已经在等待用foo写文件了,所以等待doSomething似乎没用,因为我没有对foo的结果做任何事情。@Brandon你肯定需要这样做foo()
只是一个返回承诺的函数调用,没有魔法能让doSomething
自动等待它-您需要显式地等待它,否则otherFileFunc()
将被过早调用。您正在对结果做一些事情:检查文件是否完全没有错误(承诺没有拒绝)。即使没有具体的价值。当你这样解释它时,它是非常有意义的。非常感谢你。
const doSomething = async () => {
await foo(); //
otherFileFunc(); };
const foo = async () => {
const x = await getX();
return fs.promises.writeFile(path, x); // do I need to await this?
}