如何将Promises与if结合起来?

时间:2017-01-18 09:05:06

标签: javascript promise

在以下示例中,我想有条件地执行somePromise,然后无论条件如何执行anotherPromise

if (somecondition) {
    somePromise().then((args) => { ... } );
}

// Not waiting for somePromise() here, but it should.
return anotherPromise().then((args) => {
    muchmorecodehere;
}

我现在能想到的唯一方法是将最后一部分变成一个函数并在两个分支中执行它,但这看起来非常麻烦。我当然做错了什么?

let helperFunction = () => {
    return anotherPromise().then((args) => {
        muchmorecodehere;
    }
}

if (somecondition) {
    return somePromise().then((args) => { ... } ).then(helperFunction);
}

return helperFunction;

3 个答案:

答案 0 :(得分:2)

你可以利用这样一个事实:.then()会返回一个新的承诺并链接掉那个或虚假的承诺:

var nextPromise = somecondition
    ? somePromise.then((args) => { ... })
    : Promise.resolve();

return nextPromise.then(() => anotherPromise)
    .then((args) => {
        // muchmorecodehere
    });

答案 1 :(得分:1)

您可以为条件部分创建默认的,已解决的,承诺(让我们称之为conditionalPromise),并始终将此承诺与anotherPromise链接起来。

如果someConditionfalse,那么conditionalPromise是已经解决的承诺,可以安全地链接到anotherPromise

如果someConditiontrue,则somePromise已分配给conditionalPromise,当解决后,anotherPromise将会被执行。

conditionalPromise = Promise.resolve(); // Create a default, already resolved, promise
if (someCondition) {
    // Assign somePromise to conditionalPromise, overwriting the default one
    conditionalPromise = somePromise
}

// Now chain the 2 promises
return conditionalPromise.then((args) => { 
    anotherPromise.then((args) => {
        muchmorecodehere;
    }
});

答案 2 :(得分:0)

解决问题的另一种方法是将if块中的初始then包裹起来,将其链接到Promise.resolve()

return Promise.resolve().then(() => {
    if (somecondition) {
        return somePromise().then((args) => { ... } );
    }
}).then(() => {
    return anotherPromise();
}).then((args) => {
    //muchmorecodehere
});