如何从Promise发送价值'然后'赶上'?

时间:2017-12-28 07:53:47

标签: javascript json promise ipc

我只想问一下,如果解决方案的价值不合适,我应该如何将解决承诺传递给catch

e.g。

let prom = getPromise();

prom.then(value => {
    if (value.notIWant) {
        // Send to catch <-- my question is here, I want to pass it on the catch.
    }

    // Process data.
}).catch(err => {
    // Pass the error through ipc using json, for logging.
});

我尝试使用throw,但该对象无法解析为json,只是得到一个空对象。

解答:

@BohdanKhodakivskyi下面的第一条评论是我想要的答案。

@ 31py答案也是正确的,但@BohdanKhodakivskyi解决方案更加简单,并且会产生相同的结果。

4 个答案:

答案 0 :(得分:3)

您只需返回被拒绝的承诺:

prom.then(value => {
    if (value.notIWant) {
        return Promise.reject('your custom error or object');
    }

    // Process data.
}).catch(err => {
    console.log(err); // prints 'your custom error or object'
});

.catch实际上处理链中的任何承诺拒绝,因此如果您返回被拒绝的承诺,控件会自动转到catch

答案 1 :(得分:3)

只需使用throw value;即可。在你的情况下:

prom.then(value => {
    if (value.notIWant) {
        // Send to catch
        throw value;
    }

    // Process data.
}).catch(err => {
    // Pass the error through ipc using json, for logging.
});

请注意使用Promise.reject()throw之间的差异和限制,this question中有完整描述。例如,throw在某些async方案中无效。

答案 2 :(得分:1)

为什么你不重新抛出错误? throw new Error("something");

答案 3 :(得分:0)

您可以在functions之外使用它来执行此操作:

var processData = function(data) {
   // process data here
}

var logIt = function(data) {
   // do logging here..
}

let prom = getPromise();

prom.then(value => {
    if (value.notIWant) {
        // Send to catch <-- my question is here, I want to pass it on the catch.
        logIt(/*pass any thing*/);
    }

    // Process data.
    processData(data);

}).catch(err => {
      logIt(/*pass any thing*/);
});