簡體   English   中英

角中的$ q.all()不能很好地解決

[英]$q.all() in angular does not resolve well

我在工廠做3 $ http電話,我遇到了麻煩。

我宣布了4個承諾:

var promise = $q.defer(),
  PBdeferred = $q.defer(),
  Rdeferred = $q.defer(),
  Pdeferred = $q.defer();

之后,我第一次調用API

$http.get('/pendingBills').then(function(response) {
  var PendingBills = ['id', 'path', 'reservas', 'importe', 'fecha'];
  PBdeferred.resolve(PendingBills);
});

現在用一個空數組解決最后2個promises(我還沒有endopoint)

  Rdeferred.resolve([]);
  Pdeferred.resolve([]);

我在哪里使用$ q.all

$q.all([PBdeferred, Rdeferred, Pdeferred]).then(function (results){
    console.log('Results', results);
    promise.resolve({
      PendingBills: results[0],
      Remittances: results[1],
      Payed: results[2]
    });
  });

並返回高級承諾

return promise.promise;

控制台日志顯示了承諾,但我認為在那里承諾得到解決。

有什么想法解決這個問題?

你沒有正確使用$q.all 它需要一個promises的數組(或對象),而不是一個deferred數組。

更改

$q.all([PBdeferred, Rdeferred, Pdeferred])

$q.all([PBdeferred.promise, Rdeferred.promise, Pdeferred.promise])

你沒有正確使用promises,因為你使用deferred這是一個打破promises鏈的反模式。 而不是使用延遲,只需獲得每個操作的承諾,然后使用$ q組合它們:

var PBpromise = $http.get('/pendingBills').then(function(response) {
  return ['id', 'path', 'reservas', 'importe', 'fecha']; // this will return a promise with the array as the resolve value
});

var Rpromise = $q.resolve(); // a promise that is resolved immediately. Later you can replace it with the $http call 

var Ppromise = $q.resolve(); // a promise that is resolved immediately. Later you can replace it with the $http call 

var promise = $q.all([PBdpromise, Rpromise, Ppromise]).then(function (results){ // $q.all also returns a promise
    console.log('Results', results);
    return { // this will be the resolve value of the returned $q promise
      PendingBills: results[0],
      Remittances: results[1],
      Payed: results[2]
    };
  });

請注意, $q.resolve()僅在角度為1.4時可用。 如果您使用的是先前版本,請使用$q.when({})而不是$q.resolve()

暫無
暫無

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

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