javascript - Promise - 在多个事件后解决
问题描述
我正在使用一个异步连接到 API 的承诺。API 发出两个事件:connected
和socketConnected
.
根据我的connect()
功能,我想等待这两个事件触发。
connect() {
return new Promise((resolve,reject)=>{
this._client.on('connected', resolve);
this._client.on('socketConnected', resolve);
setTimeout(reject, 5000);
}
}
但是,您只能解决一次,我希望这两个事件在承诺解决之前触发。我该如何设置它以使其行为如此?
解决方案
您需要使用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();
});
});
}
推荐阅读
- playframework - 使用 Keycloak 作为 Web 和移动客户端的 OIDC 服务器
- angularjs - Liferay 7 AngularJS 和多个 portlet
- scala - 如何在 Anorm 中调用具有 IN 和 OUT 参数的“程序”
- javascript - 根据下拉选择填充文本框值
- excel - 计算非空白单元格的数量&如果包含某个字符减去excel中的值
- python - 从串行输出中提取一些值的python脚本
- python - 在每个视图函数中关闭与 DB 的连接,Django
- perl - 我怎样才能对这个哈希数组进行排序?
- c++ - 我创建了一个简单的程序,但有些地方不对劲
- google-cloud-platform - 权限被拒绝(公钥)。- 我无法在 Google Cloud Platform 上登录我的虚拟机