2014-03-01 78 views
5

我正在學習Angular JS,當時我正在嘗試瞭解承諾和異步編程,我對$q.defer()有懷疑。我的觀點是這樣的:平時人們,他們做這樣的事情的承諾,考慮到$ Q的工作已經可以

function someAsyncFunction() { 
    var deferred = $q.defer(); 

    /* Do things and if everything goes fine return deferred.resolve(result) 
     otherwise returns deferred.reject() 
    */ 

    return deferred.promise; 
} 

這是什麼真正在做什麼?當我們執行var deferred = $q.defer()時,它立即將該函數的所有執行切換到另一個線程,並返回作爲此操作結果參考的promise,該結果仍在那裏執行?

這是我們在創建異步方法時應該考慮的方式嗎?

+0

JavaScript是在$ Q [鏈接](HTTPS AngularJS API給單線程(不含網絡工作者) – Lucius

+0

很好的解釋://文檔.angularjs.org/API/NG /服務/ $ q) – ravi

回答

0

Angular的$q服務基於Javascript庫Q。您可以在Q documentation中閱讀更多內容,或閱讀github repo中的代碼。我認爲這部分從引進到文檔剪斷解釋說得好:

如果一個函數不能返回值或拋出一個異常,而不 阻塞,它可以返回一個承諾來代替。承諾是 代表函數 最終可能提供的返回值或引發的異常。承諾還可以用作遠程對象的代理來克服延遲。

0

With $ q u異步運行函數。 延遲對象表示某件事完成了某些任務。

var defer = $q.defer();// we create deferred object, which will finish later.

defer.promise // we get access to result of the deferred task 

.then(// .then() calls success or error callback 
    function(param) { 
     alert("i something promised " + param); 
     return "something"; 
    }); // u can use 1 or more .then calls in row 

defer.resolve("call"); //returns promise 

這裏例如: http://jsfiddle.net/nalyvajko/HB7LU/29048/