将 Promise 与事件相结合

Combining Promise with Events

一个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?
  });
}

这是您无法避免创建新承诺的少数情况之一。你会在 then 和 return 中这样做:

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..*/);
      });
    });
  });
}

很容易在 90% 的时间里,你已经有了一个可以使用的承诺(最常见的承诺错误之一是在你不需要的时候创建它们),但你没有可以用来等待您示例中的事件。