首页 > 解决方案 > Promise - 在多个事件后解决

问题描述

我正在使用一个异步连接到 API 的承诺。API 发出两个事件:connectedsocketConnected.

根据我的connect()功能,我想等待这两个事件触发。

connect() {
  return new Promise((resolve,reject)=>{
    this._client.on('connected', resolve);
    this._client.on('socketConnected', resolve);
    setTimeout(reject, 5000);
  }
}

但是,您只能解决一次,我希望这两个事件在承诺解决之前触发。我该如何设置它以使其行为如此?

标签: javascriptnode.jspromise

解决方案


您需要使用Promise.all创建两个承诺,每个事件一个,并且当两者都解决时 - 当Promise.all解决时 - 您可以解决connect返回的承诺:

connect() {
  return new Promise((resolveAll, rejectAll) => {
    Promise.all([
      new Promise(res1 => this._client.on('connected', res1)),
      new Promise(res2 => this._client.on('socketConnected', res2))
    ]).then(resolveAll);
    setTimeout(rejectAll, 5000);
  });
}

Promise.all如果您希望垃圾收集尽快发生,您也可以在解析时清除超时:

connect() {
  return new Promise((resolveAll, rejectAll) => {
    const rejectTimeout = setTimeout(rejectAll, 5000);
    Promise.all([
      new Promise(res1 => this._client.on('connected', res1)),
      new Promise(res2 => this._client.on('socketConnected', res2))
    ]).then(() => {
      clearTimeout(rejectTimeout);
      resolveAll();
    });
  });
}

推荐阅读