2015-07-11 131 views
4

我對推遲的Angular JS和$ q之間感到困惑。我發現這個SO Question解釋$q.defer()$q。它的區別解釋

$ q.reject是一個快捷方式創建一個延遲,然後拒絕立即

所以$q.reject()必須等於

var deferred = $q.defer(); deferred.reject(),如果不是請說明兩者的實際區別。

但在我的情況下,$q.reject()正在工作,但deffered.reject()不起作用。此外,我們需要返回拒絕承諾,如$q.reject()但不是deferred.reject()。我所看到的例子那裏是deffered.reject()

這不歸是,這是不工作的代碼

var deferred = $q.defer(); 
myService.getData() 
.then(function(response){ 
    deferred.notify('Just a notification'); 
    deferred.reject('rejected'); 
}) 
.then(function(response) { 
    console.log('done');  
}, function(response) { 
    console.log('rejected'); 
}) 

,但是當我更換deferred.reject$q.reject(),承諾已被拒絕,並且控制移到隨後的錯誤功能塊。

任何幫助,非常感謝。提前致謝。

+0

它不會在您的情況在所有的工作,你鏈式'。然後(功能(響應...'到諾言'.getData( )'已經返回了,而不是延遲'已經返回的承諾,爲什麼這個工作沒有意義? –

回答

5

當您使用deferred.reject時不起作用,因爲您沒有返回新的被拒絕承諾。在這兩種情況下,您只需使用$q.reject()deferred.reject()即可退貨。

你需要明白,

  • $q.reject()被拒絕承諾對象
  • deferred.reject()承諾,但推遲其在它的一個屬性已經拒絕承諾對象(即$promise)。

因此,您可以返回任何對象或值,它將成爲一個新的承諾對象,並將傳遞給鏈中的下一個塊。然而,當你return deferred.reject()它將被作爲一個對象傳遞(再一次,這不是承諾,但它有承諾內),當然下一個承諾將得到成功解決。

它將與deferred正常工作太多,如果你返回相應的承諾:

var deferred = $q.defer(); 
myService.getData() 
    .then(function(response) { 
     deferred.notify('Just a notification'); 
     deferred.reject('rejected'); 
     return deferred.promise; 
     //return $q.reject(); 
    }) 
    .then(function(response) { 
     console.log('done'); 
    }, function(response) { 
     console.log('rejected'); 
    }); 

最後回答你的問題:$q.reject()與地位的承諾對象「拒絕」。 deferred.reject()不是一個承諾,但它拒絕承諾對象裏面爲deferred.$promise。要使用什麼?你應該使用$q.reject(),在這種情況下使用虛擬延遲對象是多餘的,並被認爲是不好的做法,事實上它甚至有一個名稱爲deferred anti-pattern

+0

好的答案!非常感謝。還有一個問題。什麼是實際承諾對象和差異對象。 – Wishnu

+0

promise對象在deferred.promise中可用。當我登錄對象時得到它。 – Wishnu

+0

我的疑問是我們返回的diferred.promise與我們在錯誤塊中獲取的響應對象不同。幕後發生了什麼? – Wishnu

2

確保你已經回覆了承諾。

function getData() { 
    var deferred = $q.defer(); 
    myService.getData() 
     .then(function (response) { 
      deferred.resolve('Just received a notification'); 
     }).catch(function (err) { 
      deferred.reject(err); 
     }; 

    return deferred.promise; 
} 

getData().then(function (response) { 
    console.log('done'); 
}, function (response) { 
    console.log('rejected'); 
}); 
+0

我實際上有這個代碼片段在我的控制器裏面,請你解釋一下爲什麼我應該返回一個承諾 – Wishnu

+0

當然,承諾是'.then','.catch','.finally'的屬性,所以你必須返回承諾,以便它可以實現。當你做'$ q.reject'時,你返回一個履行了諾言,儘管被拒絕了。 –

0

這正與Q(https://github.com/kriskowal/q

var def = Q.defer(); 
def.promise 
.then(
    function(ok){ 
     return ok; 
    }, 
    function(err){ 
     var d = Q.defer(); 
     d.reject(err); 
     return d.promise; 
    } 
) 
.then(
    function(ok){ 
     console.log('ok',ok); 
    }, 
    function(err){ 
     console.log('err',err); 
    } 
); 
def.reject('error');