gpt4 book ai didi

javascript - promise 拒绝功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:55 26 4
gpt4 key购买 nike

在 javascript 中我如何拒绝 promise ?简单地返回 new Error('blah') 不正确错误控制台抛出“.then 不是函数”或类似的东西。

所以我包含了 Promise.jsm,然后 return Promise.reject(new Error('blah')) 所以我的问题是:如果我在这样的 promise 中:那么我不必返回Promise.rject 并且可以直接返回新的错误吗?

 //mainPromise chains to promise0 and chains to promise1
function doPromise(rejectRightAway) {
if (rejectRightAway) {
return Promise.reject(new Error('intending to throw mainPromise rejection')); //is this right place to use Promise.reject? //returning just new Error throws in error console, something like: '.then is not a function' and points to the onReject function of mainPromise.then
}

promise0.then(
function () {

var promise1 = somePromiseObject;
promise1.then(
function () {
alert('promise1 success');
},
function (aRejReason) {
alert('promise1 rejected ' + aRejReason.message);
return new Error('promise1 rejected so through promise0 rej then mainPromise rej'); //want to throw promise1 rejection //ok to just return new Error?
}
);
},
function (aRejReason) {
alert('promise0 rejected with reason = ' + aRejReason.message);
}
);

return promise0;

}

var mainPromise = doPromise();
mainPromise.then(
function () {
alert('mainPromise success');
},
function (aRejectReason) {
alert('mainPromise rejected with reason = ' + aRejectReason.message)
}
);

我不确定这段代码是否有效,所以我的问题是我如何拒绝 --- 比如何时返回 Promise.reject(new Error()) 以及何时返回 新的错误()

最佳答案

tl:dr

  • 为了表示一个操作正常完成,你返回它的结果return result
  • 为了指示异常,您throw new Error(reason) 就像在同步代码中一样,promises 是安全的。
  • 可以显式地返回来自链的拒绝,但通常是不需要的。

promises 的一大优点是它们修复了异步代码中的异常处理。

Promises 不仅仅是 组成顺序单子(monad) DSL 对并发的抽象——它们也是安全的!

Throw safety 在这方面真的很棒,你可以像在顺序代码中那样操作:

function foo(){
if(somethingWrong){
// instead of returning normally, we throw, using the built in exception chain
// code blocks have. This indicates something unexpected breaking the sequence of cour code
throw new Error("Something was wrong");
}
return "some normal result"; // here we indicate a function terminated normally,
// and with which value.
}

节点中的回调使用我觉得丑陋的(err,result...) 约定。有了 promises,您将再次获得顺序代码中错误处理的好处:

somePromise.then(function(){
if(rejectRightAway){
throw new Error("rejecting right away...");
}
return "some normal result";
})....

看看它与顺序代码有多相似?每当你想从 then 处理程序中拒绝你 throw 时,无论何时你想要实现你从 then 处理程序返回。就像在“同步”代码中一样。

所以在你的情况下:

//want to throw promise1 rejection //ok to just return new Error?
return new Error('promise1 rejected so through promise0 rej then mainPromise rej');

完全按照您的直觉想做的事情解决:

 throw new Error("promise1 rejected so through promise0 rej then mainPromise rej");

关于javascript - promise 拒绝功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22820101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com