根据promise值返回结果

时间:2017-06-02 07:27:11

标签: javascript promise axios

我已经开始使用axios,一个基于承诺的HTTP客户端,但我还没有想出如何根据承诺值返回结果。

以下是我的代码的简化版本:

/dev/mtdN

我希望isUnique函数根据countClients输出返回一个布尔值。

1 个答案:

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