承诺执行条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了承诺执行条件相关的知识,希望对你有一定的参考价值。

我有一个以下的承诺功能

function run(args) {
    return new Promise(function(resolve, reject) { //logic });
}

我想传递一个参数到promise函数run和返回值我想要一些条件,如果它满足我想将一组参数传递给promise并且如果它失败了另一组结果并且基于上述承诺的结果是最后一个承诺,其中来自上述承诺的合并值作为参数。

run(a)
    .then(()  =>{
    if (condition) {
        run(b)
            .then(() => {
                return something
            })
    }
    else
        run(c)
            .then(() => {
                return something
            })
})
.then(rows => {
    use the something returned
})

像上面的东西是否有可能。如果两个条件都不满足怎么处理错误呢?

或者有更好的方法吗?

答案

真的,那是两个问题,但是哦......

有条件地返回两个不同的承诺之一

基本上,在第一个.then(),你必须返回一个承诺。你可以在returnrun(b)之前添加run(c)。这将使第二个.then()获得something的价值。

.then(() => {
    if (condition) {
        return run(b).then(() => {
            return something;
        });
    } else {
        return run(c).then(() => {
            return something;
        });
    }
})

投掷和处理错误

你的场景是一个简单的if-else。其中一个将永远满足,所以没有“如果没有满足条件”。但是,让我们假设您有两个条件,并且必须满足一个条件才能使整个事情得到满足。你需要做的就是扔一个Error

.then(() => {
    if (condition1) {
        return run(b);
    } else if (condition2) {
        return run(c);
    }
    throw new Error("Neither condition was true.");
})
.then(rows => {
    // use the something returned
})
.catch(err => console.log(err));

投掷的Error对象将被最终的err作为参数.catch()收到。

另一答案

有许多不同的方法来处理这个,但这里有一个。

then((data) => {
    let nextCall;

     if ( data === "Something") {
          nextCall = somePromiseFunction(data);
     } else {
          nextCall = someOtherPromiseFunction(data);
     }

     return nextCall;
})
.then((data) => { ... })

以上是关于承诺执行条件的主要内容,如果未能解决你的问题,请参考以下文章

4.3 合并重复的条件执行片段

兼容ie8,firefox,chrome浏览器的代码片段

自动刷新android片段,直到满足条件

猫鼬承诺在某些条件下无法解决

量角器预期条件包装器返回布尔承诺

shell if 语句