Angular等待承诺解决,然后继续

时间:2018-07-06 02:38:09

标签: angular promise

我的以下代码是项目验证部分的一部分。这段代码的目的是检查引用表中是否存在值。如果存在,则可以继续。如果不是,则抛出错误并停止用户。

saveChanges() {
    //blah blah
    if (needTovalidate){
    passedCheck = false;
    this.validationService.checkExistence(value)
    .then((exist: boolean) => {
      passedCheck = exist;
      console.log("INSIDE: " + exist);

    });
    console.log("OUTSIDE: " + passedCheck);

    if(passedCheck) {
        //Rest of code
    } else {
        //Throw error msg
    }
}


public async checkExistence(value: string): Promise<boolean>{
  var exist = false;
  return this.getRefData().then((rec: dataModel[]) => {
    return rec.some(el => {
      return el.col1 === value;
    });
  });
}

private async getRefData() {
  return await this.configurationService.retrieveTableData().toPromise(); 
}

预期日志:

INSIDE: true
OUTSIDE:true

实际日志:

OUTSIDE: false
INSIDE: true

很明显,代码在继续下一行之前并没有等待布尔诺式解决。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

正如@ jfriend00在您的评论讨论中提到的,这是对类似问题的重复,每当使用异步函数(PromiseObservable)时,您都应使异步性回到调用中,{{ 1}}或.then

Return value with asynchronous functions in Typescript

  

有什么建议吗?

您可以通过类似的方式更改.subscribesaveChanges函数:

请参见下面的示例,并可能在编辑中清理问题示例代码(如果不重写以提出更好的示例问题,我相信您至少可以花一些时间在过程中自行解决问题)再次仔细检查一下)

您提供的伪代码有两个问题,但是我尝试尽最大可能在概念上对过程进行概念化,同时保持对您原始代码的忠诚。

checkExistence

这是在Angular中,这可能与Angular形式有关吗? Async validators might be helpful to you even if not directly related

Return value with asynchronous functions in Typescript类似的问题,也许还有很多其他问题 我发现在这些类型的问题中存在类似的不一致之处,可以通过在saveChanges(needToValidate: boolean, // ?? changesToValidate: Changes, asyncValidateFunction: (changes: Changes) => Promise < boolean > , // hmm ) { asyncValidateFunction(changesToValidate); //blah blah if (needToValidate) { // Random context here? Feels like too many things going on in one. Try to isolate functionality. this.validationService.checkExistence(value) .then( (exist: boolean) => { yourStuffToDoAfterPassedCheckValidation(exist) // hmm console.log("INSIDE: " + exist); // be safe and stay inside :) } ); } } // Tried to encapsulate as much as your original concept and style from original question. // Please refactor this based on your understanding yourStuffToDoAfterPassedCheckValidation(passedCheckFlag: boolean) { if (passedCheckFlag) { // Rest of code } else { // Throw error msg } } public checkExistence(value: string): Promise < boolean > { // Unused junk code? var exist = false; return this.getRefData() .then( (rec: dataModel[]) => { return rec .some(el => { return el.col1 === value; }); }); }中进行显式键入来解决,以提供对事件的更快反馈,以防止出现问题!

如果您需要更多具体的帮助,请提供原始代码的重构版本,因为某些内容似乎已被弱替换。

否则,我们可以更清晰地处理伪代码。 由于这似乎是一个重复的问题,会产生类似的异步错误,所以您需要提供一个代码无法正常工作的上下文,否则其他问题已经提供了全面的答案。

在对纠结的代码进行故障诊断时,它可以帮助您首先将整个程序流重写为伪代码,然后根据该代码重新生成代码以巩固您要理解的内容。 (这就是为什么我有时建议手写您的程序,或者至少将所有内容分解为分配的变量,显式键入所有内容,并尽可能多地使用TypeScript语言服务的原因。< / sub>

编辑:我看到您已经已经重复了自己的问题,该问题更加清楚了,并且正在努力解决您的问题。希望您能将您的问题更新到一个地方。从其他问题的注释中,您似乎不想遵循关于TypeScript的基本异步用法的建议,而仍然希望依赖于尚不存在的突变值(异步)。

答案 1 :(得分:0)

我最简单的使用方法是创建一个布尔变量,并在thencatch中将其设为false

示例:

let isPromisePending = false;

function someFn() {
  isPromisePending = true;
  myPromise().then(() => {
    isPromisePending = false;
    //Success handler below
  }).catch(() => {
    isPromisePending = false;
    //Error handler below
  })
}
相关问题