2015-12-03 69 views
2

我使用nodejs和庫Promise/A +(選擇這個,因爲它似乎是最受歡迎的)https://www.npmjs.com/package/promise。我面臨的問題是,儘管異步函數正在完成,但它仍然在失敗語句後完成。所以sv + ' No it failed'總是打印在一個console.log消息(表明它已成功)之前,我在異步方法中。這個console.log消息應該先打印出來,因爲它在async方法中。我爲什麼會發生這種事情?即使異步方法返回成功,該承諾始終在失敗時運行?Nodejs保證不會按照它應該那樣工作?

我的代碼:

var promise = new Promise(function (resolve, reject) { 

     var u = asyncmethod(some_var); 

      if (u){ 
       resolve(some_var) 
      } 
      else{ 
       reject(some_var); 
      } 
    }); 


    promise.then(function(sv) { 
     console.log(sv + ' Yes it worked'); 
    }, function(em) { 
     console.log(sv + ' No it failed'); 
    }); 
+1

此代碼正常工作,因爲它應該。如果asyncmethod是異步的,那麼你沒有用這個代碼實現任何東西 - 因爲promises不會使異步代碼同步......另外,如果你使用的是nodejs,爲什麼不使用它的原生Promise(假設你正在使用nodejs 4.x或5.x) –

+0

通常的'asyncmethod'要麼回調或返回一個承諾。你的既不。那麼它是如何異步的呢? – Bergi

回答

4

問題在您的asyncmethod,它應該是異步功能

var promise = new Promise(function (resolve, reject) { 
    //var u = asyncmethod(some_var); // <-- u is not defined, even if you return result stright, as it's the nature of async 

    asyncmethod(some_var, function(err, result){ //pass callback to your fn 
     if(err){ 
      reject(err); 
     } else { 
      resolve(result); 
     } 
    }); 
}); 
promise.then(function(successResponse) { //better name variables 
    console.log(successResponse + ' Yes it worked'); 
}, function(errorResponse) { 
    console.log(errorResponse + ' No it failed'); 
}); 

//and simple implementation of async `asyncmethod` 
var asyncmethod = function(input, callback){ 
    setTimeout(function(){ 
     callback(null, {new_object: true, value: input}); 
    }, 2000); //delay for 2seconds 
} 

注意:顧名思義,這個答案認爲asyncmethod is async

+0

感謝它現在的作品! – user2924127

0

你就錯了,你讀到的承諾任何文件? 首先,你不需要額外的包,nodejs已經包含Promise。

如果asyncMethod是一個承諾,你可以直接做到這一點:

var promise = asyncmethod(some_var); 

promise.then(function (sv) { 
    console.log(sv + ' Yes it worked'); 
}, function (em) { 
    console.log(sv + ' No it failed'); 
}); 
+0

如果我刪除軟件包並使用此代碼,我會得到以下錯誤:TypeError:無法讀取undefined的屬性'then' – user2924127

+1

這意味着您的'asyncmethod'不會返回Promise(您仍然可以刪除軟件包)。另一個答案應該起作用(來自Medet Tleukabiluly)。 – Shanoor