javascript - 如何触发两个 Promise 并有条件地等待一个?

标签 javascript jquery typescript promise

例如:我正在访问网站的“创建新帐户”页面。在创建帐户之前,我需要确定给出的电子邮件是否是垃圾电子邮件(即 test@test.com)。我还需要确定帐户是否已经存在,返回应该使用而不是新帐户的可能帐户列表(也许地址已经存在,等等)这些定义如下:

function emailIsValid(): JQueryPromise<boolean> { ... }
function getPotentialDuplicates(): JQueryPromise<IDupResults> { ... }

假设,getPotentialDuplicates 调用必须检查一个非常旧的数据库,该数据库速度非常慢,需要 3-5 秒才能完成,而 emailIsValid 通常需要 0.4 秒秒。因此,我想同时关闭这两个调用,并由该操作树定义结果:

  • 如果 - getPotentialDuplicates 首先返回:
    • 等待emailIsValid返回
    • 如果 - 电子邮件有效:
      1. 如果 - 未找到重复项,则创建帐户
      2. 否则 - 向用户显示重复项。
    • 否则 - 忽略 dupResults 并显示“电子邮件无效”
  • Else - emailIsValid 返回第一个:
    • 如果 - 电子邮件有效:
      1. 等待getPotentialDuplicates
      2. 如果 - 未找到重复项,则创建帐户
      3. 否则 - 向用户显示重复项。
    • 否则 - 不要等待 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/

相关文章:

javascript - 将 bool 值传递给指令

jquery - 如何获取带有类名的内部div的值?

javascript - 在 typescript/javascript 中使用 fetch 读取 JSON

typescript - 使用枚举值作为通用参数不适用于具有多个值的枚举

javascript - 用于在渲染 React 之间调试数组的不同符号

javascript - 打开选择用javascript点击另一个元素

javascript - 在执行下一步 JS 之前需要进行多次 Async 调用

javascript - React.js 不会在 setState 上重新渲染

javascript - 一侧文字行情

javascript - jQuery 检查 div 是否包含文本不起作用