代码之家  ›  专栏  ›  技术社区  ›  xzk

在进行之前,等待承诺得到解决

  •  4
  • xzk  · 技术社区  · 6 年前

    下面的代码是项目验证部分的一部分。这段代码的目的是检查一个引用表中是否存在一个值。如果确实存在,那么OK继续进行。如果没有,抛出错误并停止用户。

    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
    

    很明显,代码并没有等到布尔值承诺被解析后才进入下一行。

    有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   mittens pair    6 年前

    正如@jfriend00在您的评论讨论中提到的,无论何时使用异步函数,这都是类似问题的重复( Promise 我是说, Observable )您应该将异步性泡沫化回调用,然后 .then .subscribe 就在那儿。

    Return value with asynchronous functions in Typescript

    有什么建议吗?

    你可以改变你的 saveChanges checkExistence 功能与此类似:

    请看下面的例子 或许你可以在编辑中清理你的问题示例代码(如果不是为了更好的示例问题而重写的话,我相信你至少可以在这个过程中自己解决问题,花点时间再仔细检查一遍)

    您提供的伪代码有一些问题,但我尽量使流程概念化,同时保持对原始代码的真实性。

    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;
              });
          });
    }

    因为这是角的,这可能和角的形式有关吗? Async validators might be helpful to you even if not directly related

    类似的问题 Return value with asynchronous functions in Typescript 也许还有很多其他的 我在这些类型的问题中看到类似的不一致,可以通过显式键入 TypeScript 提供更快的反馈,防止事情出错!

    如果您需要更具体的帮助,请提供原始代码的重构版本,因为有些东西似乎被弱替换了。

    否则,我们可以更清楚地处理伪代码。 由于这似乎是一个重复的问题,会出现类似的异步错误,因此由您提供代码无法工作的上下文,否则其他问题中已经有了全面的答案。

    在对纠结的代码进行故障排除时,它可能会帮助您先将整个程序流重写为伪代码,然后基于此重新生成代码,以整合您试图理解的内容。 (这就是为什么我有时建议您编写程序,或者至少将所有内容分解为指定的变量,显式地键入所有内容并尽可能多地使用 类型脚本 尽可能提供语言服务。

    编辑: 我知道你有 已经 重复你自己的问题,这是一个更清楚,正在努力解决你的问题。我希望你能在一个地方更新你的问题。从您其他问题中的注释中,您似乎不想遵循对基本异步用法的建议 承诺 并且仍然依赖于一个不存在的突变值(异步)。