将承诺与事件结合起来

时间:2016-09-12 09:41:32

标签: javascript events javascript-events promise 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?
  });
}

1 个答案:

答案 0 :(得分:4)

这是少数无法避免创建新承诺的情况之一。你可以在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..*/);
      });
    });
  });
}

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