例如:我正在访问网站的“创建新帐户”页面。在创建帐户之前,我需要确定给出的电子邮件是否是垃圾电子邮件(即 test@test.com)。我还需要确定帐户是否已经存在,返回应该使用而不是新帐户的可能帐户列表(也许地址已经存在,等等)这些定义如下:
function emailIsValid(): JQueryPromise<boolean> { ... }
function getPotentialDuplicates(): JQueryPromise<IDupResults> { ... }
假设,getPotentialDuplicates
调用必须检查一个非常旧的数据库,该数据库速度非常慢,需要 3-5 秒才能完成,而 emailIsValid
通常需要 0.4 秒秒。因此,我想同时关闭这两个调用,并由该操作树定义结果:
- 如果 -
getPotentialDuplicates
首先返回:- 等待
emailIsValid
返回 - 如果 - 电子邮件有效:
- 如果 - 未找到重复项,则创建帐户
- 否则 - 向用户显示重复项。
- 否则 - 忽略 dupResults 并显示“电子邮件无效”
- 等待
- Else -
emailIsValid
返回第一个:- 如果 - 电子邮件有效:
- 等待
getPotentialDuplicates
- 如果 - 未找到重复项,则创建帐户
- 否则 - 向用户显示重复项。
- 等待
- 否则 - 不要等待
getPotentialDuplicates
并显示“电子邮件无效”
- 如果 - 电子邮件有效:
目前我正在使用 when.done
但这会等待两者完成。有没有一个简单的方法来定义它?
最佳答案
在这两种情况下,您都想等待emailIsValid
。所以:
// kick off both
const emailIsValidProm = emailIsValid();
const getPotentialDuplicatesProm = getPotentialDuplicates();
emailIsValidProm.then((res)=> {
if (res.invalid) { // if res in valid
return;
}
else {
// now wait for the other
return getPotentialDuplicatesProm
}
})
.then(res=> {
if (!res) return; // email wasn't valid;
// The res is for `getPotentialDuplicatesProm
// USE it !
})
PS:强烈建议不要使用 Jquery Promise 并使用标准 Promise api。我有关于标准文档:https://basarat.gitbooks.io/typescript/content/docs/promise.html
关于javascript - 如何触发两个 Promise 并有条件地等待一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604259/