强制node-qrcode在脚本结束之前将数据放入PNG文件

时间:2019-11-15 09:17:33

标签: node.js promise async-await

我正在尝试编写一个脚本,该脚本创建多个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');

1 个答案:

答案 0 :(得分:0)

在您的情况下,输出将是以下内容,并且可以预期,因为即使使用async / await,NodeJS仍然是异步的。

almost done
callback

NodeJS在处理脚本时首先到达console.log('almost done');,而QRCode.toFile()正在努力解决您的诺言并输出console.log('callback')。 QR码的处理需要一些时间,它将在一段时间后完成,但是首先到达almost done输出。

另外,您的输出是在不同的上下文中执行的,因此不应期望它被一对一执行。

UPD:

要依次执行同步和异步操作,您可以执行以下操作。

(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函数的代码的语法和结构更类似于使用标准同步函数。