簡體   English   中英

為什么deferred.resolve的行為與q手冊中指定的不同?

[英]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 您可以通過兩種方法來完成。

  1. 使用def.reject(err);拒絕它def.reject(err);
  2. 如您的報價所述,使用被拒絕的承諾def.resolve(rejected);解決它def.resolve(rejected);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM