承诺是否能及时成为条件句的一部分?

Does a promise resolve in time to be part of a conditional

本文关键字:条件 一部分 是否 承诺      更新时间:2023-09-26

我需要测试promise的结果。承诺能及时成为条件句的一部分吗?

if (myPromise() > 15 && myOtherPromise()) {
    // do stuff when myPromise resolves to over 15 and myOtherPromise is true
} else {
    // do stuff when myPromise resolves to 15 or less or myOtherPromise is false
}

或者我只需要忍着,然后做:

let myP = myPromise();
let myOtherP = myOtherPromise();
promise.all([myP, myOtherP]).then(function(res) {
    if (res[0] > 15 && res[1]) {
        // do stuff when myPromise resolves to over 15 and myOtherPromise is true
    } else {
        // do stuff when myPromise resolves to 15 or less or myOtherPromise is false
    }
});

从下面的评论中转发,因为每个人都在"否定"这个问题,并认为这是一个重复。

嗯,是也不是。不,因为我正在使用Jasmine, expect调用在传递承诺时自动解析承诺。expect(myPromise()).toBeGreaterThan(15)。因此,从外部来看,可以想象if的条件可以在执行任何比较之前解析承诺。

假设myPromisemyOtherPromise是返回承诺的函数,您的代码似乎表明,那么NO您不能这样做:

if (myPromise() > 15 && myOtherPromise()) {

承诺是对象。因此,如果myPromise()返回一个承诺,则:

if (myPromise())`

始终为真,并且if语句与承诺的最终解决值完全无关。因此,第一个if语句将不会检查两个promise的解析值。


如果你想看到一个促销的解析值,你必须使用.then().all()之类的东西来获得解析值。没有其他方法可以访问解析后的值。

如果您想检查myPromise()myOtherPromise()的解析值,那么您必须等待它们都解析,并且您应该使用Promise.all(),如第二个代码示例:

Promise.all([myPromise(), myOtherPromise()]).then(function(results) {
    if (results[0] > 15 && results[1]) {
        // got the result we wanted
    }
}).catch(function(err) {
    // error here
});