我正在尝试编写一个脚本,该脚本创建多个QR码PNG文件,然后对新创建的文件进行处理。
我正在使用node-qrcode
,但是在脚本结束之前它不会将数据刷新到文件中。
这是脚本的相关部分:
const QRCode = require('qrcode')
const myFunc = async () => {
return new Promise( (res, rej) => {
QRCode.toFile(
'foo.png',
[{ data: [253,254,255], mode: 'byte' }],
() => {
res(true);
console.log('callback')
}
)
});
}
(async () => {
await myFunc()
})()
console.log('almost done');
答案 0 :(得分:0)
在您的情况下,输出将是以下内容,并且可以预期,因为即使使用async
/ await
,NodeJS仍然是异步的。
almost done
callback
NodeJS在处理脚本时首先到达console.log('almost done');
,而QRCode.toFile()
正在努力解决您的诺言并输出console.log('callback')
。 QR码的处理需要一些时间,它将在一段时间后完成,但是首先到达almost done
输出。
另外,您的输出是在不同的上下文中执行的,因此不应期望它被一对一执行。
要依次执行同步和异步操作,您可以执行以下操作。
(async () => {
console.log('Operation before `myfunc`');
await myFunc();
console.log('Operation after `myfunc`');
await smthElse();
console.log('End Of Script');
})()
在这种情况下,您应该将所有初始作用域包装到异步功能中,并像上面描述的那样就地调用它(和有问题的)与(async () => { ... })()
。而且您的主要作用域将仅包含立即被调用的单个函数。
如docs中所述:
async
函数声明定义了一个异步函数,该函数返回一个AsyncFunction
对象。 异步函数是通过事件循环异步运行的函数,使用隐式Promise返回其结果。但是,使用async
函数的代码的语法和结构更类似于使用标准同步函数。