我正在尝试验证页面上的各种元素及其数据。我有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);
});
}
答案 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);
});
}