如何摆脱'return new Promise'而不丢失数据?



在这种情况下,没有什么比等到收到数据,然后解析 Promise 更容易的了:

// Using Promise resolve/reject
module.exports = () => {
   return new Promise(async (resolve, reject) => {
      let doc = await Document();
      doc.on('data', async (data) => {
         resolve(data);
      });
   })
}

但是在这种情况下我该怎么办?

// Using async/await
module.exports = async () => {
   let doc = await Document();
   doc.on('data', (data) => {
      // ???
   });
}

你仍然需要new Promise,你只需要使用它作为async函数中await的操作数,而不是使用async函数作为执行器:

module.exports = async () => {
    const doc = await Document();
    return new Promise(resolve, reject) => {
        doc.on('data', resolve);
    });
};

但是,我建议使用 once 而不是 on 以便在事件第一次发生后删除事件处理程序 - 无论如何,承诺只能解决一次。此外,如果您有节点 v11.13.0 或更高版本,您可以使用 events.once 方法,这样您就不必自己构建承诺 - 它还可以正确处理错误事件:

const { once } = require('events');
module.exports = async () => {
    const doc = await Document();
    return once(doc, 'data');
};

最新更新