如何触发两个承诺并有条不紊地等待一个?

时间:2016-09-20 21:49:57

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

目前我正在使用when.done,但这等待两者完成。有没有一种简单的方法来定义它?

1 个答案:

答案 0 :(得分:3)

在您的两种情况下,您都要等待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 promises并使用标准的Promise api。我有关于标准文档的文档:https://basarat.gitbooks.io/typescript/content/docs/promise.html