javascript - Promise - 在多个事件后解决

标签 javascript node.js promise

我正在使用 Promise 异步连接到 API。 API 发出两个事件:connectedsocketConnected

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

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

但是,您只能解析一次,并且我希望在 promise 解析之前触发这两个事件。我该如何设置才能使其表现出这种方式?

最佳答案

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

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();
    });
  });
}

关于javascript - Promise - 在多个事件后解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52067701/

相关文章:

javascript - 如何将随机脚本注入(inject)到我的 Web 应用程序中?

javascript - 我收到一个错误, 'cant set headers after they are sent',无论在 node.js 上发生什么,电子邮件上的错误消息都会不断出现

java - 在 Play 2.3.7 上从 Promise<JsonNode> 检索 HTTP 状态

使用 setTimeout/异步输出的 Javascript 编码挑战

javascript - 将 Facebook 照片放在 Canvas 上,尝试将其发送到 DataURL 时会污染 Canvas 。我可以为 CORS 设置 Facebook header 吗?

javascript - 隐藏div与关闭按钮jquery仅与关联的div

ruby-on-rails - 在 ubuntu 上安装 Brunch

node.js - 嵌套 Promise 不会将错误传播到 Node.js 中的父 Promise?

javascript - jquery:隐藏表中的同级元素

javascript - 是否可以将factory_girl.js 与茶匙一起使用?