将 Promise 与事件结合起来

uzy*_*zyn 1 javascript events promise dom-events es6-promise

Promise 异步函数应该如何与事件结合完成?

function f() {
  return promisedFunction().then(event => {
    let buf = '';
    event.on('data', data => {
      buf += data.toString()
    });
    event.on('end', () => {
      return buf;
    });
    // how should I return buf here so that the promise would resolve fine?
  });
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

这是您无法避免创建新承诺的少数情况之一。你会这样做then并返回它:

function f() {
  return promisedFunction().then(event => {
    return new Promise((resolve, reject) => {
      let buf = '';
      event.on('data', data => {
        buf += data.toString()
      });
      event.on('end', () => {
        resolve(buf);
      });
      event.on(/*...presumably there's an error condition?...*/, () => {
        reject(/*..details of error..*/);
      });
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

很容易,90% 的情况下,您已经有了一个可以使用的 Promise(Promise 最常见的错误之一是在不必要时创建它们),但是您没有可以用来等待的 Promise您的示例中的事件。

  • 我通常将缓冲区推入一个数组,然后在缓冲区数组上调用“Buffer.concat”。 (2认同)