gpt4 book ai didi

javascript - 异步函数按顺序运行,为什么?

转载 作者:行者123 更新时间:2023-11-28 12:52:56 25 4
gpt4 key购买 nike

我对异步函数有点困惑。它说他们会返回一个 promise 。 Promise 通常不会在其余代码之前立即运行,因为 javascript 采用“运行至完成”方法。

但是如果异步函数返回一个 promise ,你如何解释这一点?


const _prefixJS = async file => {
console.log('running...')
fs.copyFileSync(file, `${file}.bak`);
const content = fs.readFileSync(file, 'utf8');
// Some modifications...
fs.writeFileSync(file, newContent);
console.log('stopping!')
};

console.log('start')
_prefixJS(f);
console.log('end')

// Output: start > running... > stopping! > end

在我看来,输出应该是:开始 > 结束 > 开始... > 停止!

因为 Promise 是并发运行的,并且它们被放置在事件循环的末尾。

我知道这些方法仍然是同步的,但这不是主题。我目前正在从同步 NodeJS 方法转向异步方法。我只是问,如果异步方法返回一个 promise ,它是如何在 end console.log 语句之前运行的?

最佳答案

But if async functions return a promise, how can you explain this?

async 函数同步运行,直到第一个 awaitreturn(包括隐式返回)。 (当我说“直到”时,同步部分包括 awaitreturn 右侧的操作数。)此时(awaitreturn),它返回一个 promise 。这样它就可以启动它应该启动的任何异步进程。规范 here 对此进行了介绍。 .

您的_prefixJS不包含任何awaitreturn,因此它同步运行到最后,返回一个 promise 满足undefined值。

要使您的 async 函数真正异步工作,您需要使用 fs.promises这些函数的版本并等待它们的结果。像这样的东西(未经测试):

const fsp = require("fs").promises;
// ...
const _prefixJS = async file => {
console.log('running...');
await fsp.copyFile(file, `${file}.bak`);
const content = await fsp.readFile(file, 'utf8');
// Some modifications...
await fsp.writeFile(file, newContent);
console.log('stopping!');
};

使用该函数,console.log('running'); 调用和 fsp.copyFile(...) 调用在 时同步完成_prefixJS 被调用,然后该函数返回其 Promise 并等待 fsp.copyFile(...) 的结果,然后再异步继续其逻辑。

使用 fsp 函数占位符的实时示例:

const doWork = () => new Promise(resolve =>
setTimeout(resolve, Math.random() * 2000));

const fsp = {
async copyFile() {
console.log("copyFile started");
await doWork();
console.log("copyFile returning");
},
async readFile() {
console.log("readFile started");
await doWork();
console.log("readFile returning");
},
async writeFile() {
console.log("writeFile started");
await doWork();
console.log("writeFile returning");
}
};

const _prefixJS = async file => {
console.log('running...');
await fsp.copyFile(file, `${file}.bak`);
const content = await fsp.readFile(file, 'utf8');
// Some modifications...
await fsp.writeFile(file, "newContent");
console.log('stopping!');
};

console.log("calling _prefixJS");
_prefixJS()
.then(() => {
console.log("then handler on _prefixJS()");
})
.catch(error => {
console.log(`catch handler on _prefixJS(): ${error.message}`);
});
console.log("calling _prefixJS - done");

关于javascript - 异步函数按顺序运行,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com