[英]Why does deferred.resolve not behave as specified in the q manual?
這可能是一個愚蠢的問題,但是我無法解決這個問題。
考慮以下代碼:
function throwError() {
throw Error("can't touch this.");
}
var def = q.defer();
def.promise.then(
function() {
console.log("no error");
},
function() {
console.log("error");
}
);
q.fcall(throwError).then(def.resolve, def.resolve).done();
我認為這應該顯示error
。 相反,它no error
。 q
手冊指出:
拒絕功能是解決被拒絕承諾的簡寫。
q.fcall(throwError)
應該產生一個被拒絕的承諾,所以推遲的應該被拒絕,對嗎?
請注意,這是一個純粹的假設性問題,我知道這將不會在現實世界中使用。
這里的問題似乎與所使用的語言有關,所以我將嘗試對其進行細分以使其更加清晰。 你打電話時
var rejected = q.fcall(throwError);
那么rejected
確實是一個被拒絕的承諾。 然后,您正在做的是
var def = q.defer();
def.promise.then(
function(arg1) {
console.log("no error");
},
function(arg2) {
console.log("error");
}
);
rejected.then(
function(){
def.resolve();
},
function(err){
def.resolve(err); // err === new Error();
}
);
當一個承諾被拒絕時,它將運行拒絕回調,觸發def.resolve(err);
。 Q不知道def
是除隨機性之外的任何東西,因此您最好調用def.resolve('random');
。 您正在使用一些參數來解析def
。 在這種情況下,它恰好是Error
一個實例。 這意味着將調用您的no error
回調,並且arg1 === new Error()
。
所以現在,鑒於您提到的文檔引用
拒絕功能是解決被拒絕承諾的簡寫。
什么是你正在做的基本上轉化拒絕承諾rejected
入承諾def.promise
這將永遠得到滿足,但在履行處理程序將收到一個錯誤作為第一個參數。
為了實現您的期望,您需要正確地拒絕def.promise
。 您可以通過兩種方法來完成。
def.reject(err);
拒絕它def.reject(err);
。 def.resolve(rejected);
解決它def.resolve(rejected);
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.