如何链接多个JS承诺合并布尔结果

时间:2018-08-03 14:09:59

标签: javascript promise

我正在尝试验证页面上的各种元素及其数据。我有3种不同的方法来完成验证,其中一些进行ajax调用。每个返回一个布尔值的承诺。我想将结果合并为一个变量。我以为以下代码可以正常工作,但是我的isValid变量似乎只捕获了名为saveCurrentSource()的最后一个验证函数的值。如何使isValid等于saveSourceResponse() && validateSource() && saveCurrentSource()的结果?

async validate() {
  return new Promise(resolve => {
    let isValid = this.saveSourceResponse()
      .then(saveSourceResponse => {
      console.log("saveSourceResponse",saveSourceResponse);
        return this.validateSource();
      }).then(validateSourceResponse => {
          console.log("validateSourceResponse",validateSourceResponse);
        return this.saveCurrentSource(validateSourceResponse);
      }).then(saveCurrentSourceResponse => {
          console.log("saveCurrentSourceResponse",saveCurrentSourceResponse);
        return saveCurrentSourceResponse;
      });
    resolve(isValid);
  });
}

2 个答案:

答案 0 :(得分:5)

首先,如果您使用的是async方法,则根本不需要直接访问Promise,只需使用await

async validate() {
    return (
        await this.saveSourceResponse() &&
        await this.validateSource() &&
        await this.saveCurrentSource()
    );
}

(我还在下面添加了并行版本。)

(我假设saveCurrentSource实际上不需要您传递给它的参数。)

如果您没有要访问承诺(例如,不使用async上的validate),则可以在每个{{1 }}处理程序,并且不会使用&&,因为没有理由:

then

如果我对new Promise的假设不正确,我们将相应地进行调整:

validate() {
    return this.saveSourceResponse()
        .then(isValid => isValid && this.validateSource())
        .then(isValid => isValid && this.saveCurrentSource());
}

或者:

saveCurrentSource

Sescudero points out一样,如果这些可以并行运行,则我们应该并行运行它们:

async validate() {
    return (
        await this.saveSourceResponse() &&
        await this.validateSource() &&
        await this.saveCurrentSource(true) // `true` because this won't get executed
                                           // if `this.validateSource()` resolves
                                           // to `false`
    );
}

...如果不使用validate() { return this.saveSourceResponse() .then(isValid => isValid && this.validateSource()) .then(isValid => isValid && this.saveCurrentSource(true)); // `true` again, // see above } ,则几乎相同:

async validate() {
    const results = await Promise.all([
        this.saveSourceResponse(),
        this.validateSource(),
        this.saveCurrentSource()
    ]);
    return results.every(valid => valid);
}

答案 1 :(得分:2)

您的最后一个then返回saveCurrentSourceResponse。您也需要它返回所有其他返回的响应,也许是通过将它们存储在本地变量中,如下所示:

async validate() {
  return new Promise(resolve => {
    let responses = [];
    let isValid = this.saveSourceResponse()
      .then(saveSourceResponse => {
        responses.push({saveSourceResponse});
      console.log("saveSourceResponse",saveSourceResponse);
        return this.validateSource();
      }).then(validateSourceResponse => {
        responses.push({validateSourceResponse});
          console.log("validateSourceResponse",validateSourceResponse);
        return this.saveCurrentSource(validateSourceResponse);
      }).then(saveCurrentSourceResponse => {
        responses.push({saveCurrentSourceResponse});
          console.log("saveCurrentSourceResponse",saveCurrentSourceResponse);
        return responses;
      });
    resolve(isValid);
  });
}