Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Async/Await澄清承诺顺序解决方案_Javascript_Node.js_Asynchronous_Promise_Async Await - Fatal编程技术网

Javascript 使用Async/Await澄清承诺顺序解决方案

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,然后在写入文件内容后对其进

我对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 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?
}