Javascript 功能上的拒绝承诺
在javascript中,如何拒绝承诺?简单地返回Javascript 功能上的拒绝承诺,javascript,firefox,firefox-addon,promise,Javascript,Firefox,Firefox Addon,Promise,在javascript中,如何拒绝承诺?简单地返回新错误('blah')不起作用,错误控制台抛出“.then不是函数”或类似的东西 所以我加入了Promise.jsm,然后返回了Promise.reject(新错误('blah'))所以我的问题是:如果我的承诺是:那么我就不必返回Promise.rjet,只需返回新错误,对吗 //mainPromise chains to promise0 and chains to promise1 function doPromise(rejectRigh
新错误('blah')
不起作用,错误控制台抛出“.then不是函数”或类似的东西
所以我加入了Promise.jsm,然后返回了Promise.reject(新错误('blah'))
所以我的问题是:如果我的承诺是:那么我就不必返回Promise.rjet,只需返回新错误,对吗
//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())
正确,什么时候只返回new Error()
?您需要拒绝特定的承诺:
return promise0.reject(new Error('intending to throw mainPromise rejection'));
tl:dr
- 为了指示操作的正常完成,您将返回其结果
返回结果
- 为了指示异常,您
就像在同步代码中一样,承诺是安全抛出的抛出新错误(原因)
- 可以从链中显式返回拒绝,但通常是不需要的李>
promises的一大优点是它们修复了异步代码中的异常处理 承诺不仅仅是对并发的顺序一元DSL的抽象-它们也是安全的 抛出安全性在这方面真的很棒,您可以像您在顺序代码中一样:
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…
约定,我觉得这很难看。通过承诺,您可以再次获得顺序代码中错误处理的好处:
somePromise.then(function(){
if(rejectRightAway){
throw new Error("rejecting right away...");
}
return "some normal result";
})....
看看它和顺序代码有多相似?每当你想拒绝你从then处理程序中抛出你的时,每当你想实现你从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");
啊,仅仅返回新错误不会启动拒绝链?@Noitidart正确,您需要拒绝承诺。啊,好的,如果我返回了promise.reject(
而不是promise0.reject
它能识别我要拒绝的承诺吗?我不能做main承诺。reject
在rejectRightAway
子句中,它抛出一个奇怪的错误,说然后不是一个函数
你不能做承诺。reject
因为它不能告诉你要拒绝什么承诺。我不确定为什么在你的问题中有两个承诺,为什么不在第一个承诺后附加。然后在s?注意一些库(即$q)处理throw
语句比处理$q.reject
语句更为严厉。reject返回并将它们记录到控制台。如果库无法跟踪未处理的拒绝,那么将错误记录到控制台对您来说实际上是一件好事。