我已经开始使用axios,一个基于承诺的HTTP客户端,但我还没有想出如何根据承诺值返回结果。
以下是我的代码的简化版本:
/dev/mtdN
我希望isUnique函数根据countClients输出返回一个布尔值。
答案 0 :(得分:3)
您无法基于异步计算返回同步值。 Javascript故意没有提供任何方法。您可以做的是返回Promise<boolean>
:
function isUnique(cif) {
return countClients(cif).then(function(count) {
return (count == 0);
});
}
<强>更新强>
因此,您需要将此功能提供给第三方库,它仅适用于(x:T) => boolean
类型的函数,而不适用于(x:T) => Promise<boolean>
。不幸的是,你仍然无法“等待”一个承诺,这不是JavaScript事件循环的工作方式。
使用支持异步验证功能的验证库。
我不建议这样做,但您可以缓存在操作之前可能使用的所有值。
例如,让我们说这是你打电话给第三方的方式:
function isUnique(cif) {
return true; // Dummy mock
}
var result = ThirdParty.doValidation(isUnique);
console.log(result);
相反,你可以这样写:
function isUnique(cif) {
return countClients(cif).then(function(count) {
return (count == 0);
});
}
function getRelevantCifs() {
return axios.get("/api/all-client-cifs");
}
var isUniqueCache = new Map();
function isUniqueCached(cif) {
return isUniqueCache.get(cif);
}
function buildCache() {
return getRelevantCifs().then(cifs => {
return Promise.all(cifs.map(cif => {
return isUnique(cif).then(isUniqueResult => {
isUniqueCache.set(cif, isUniqueResult);
});
}));
});
}
buildCache().then(() => {
var result = ThirdParty.doValidation(isUniqueCached);
console.log(result);
});