簡體   English   中英

Angular-For循環HTTP回調/承諾

[英]Angular - For Loop HTTP Callback/Promise

我正在嘗試編寫一個執行許多http請求並將每個響應添加到列表的循環。

但是,我認為我不會以正確的方式進行操作。

我認為我沒有正確執行所需的承諾。 for循環后的控制台日志顯示myList數組為空。

碼:

var _myList = []

function getStuff() {

    var deferred = $q.defer()

    var url = someUrl

    $http.get(url).success(function(response) {

        if ( response.array.length > 0 ) {

            // loop starts here
            for ( var i=0; i < response.array.length; i++ ) {

                getThing(response.array[i].id);

            };
            // check the varibale here

            console.log(_myList);

            deferred.resolve('Finished');

        } else {

            deferred.resolve('No stuff exists');

        };

    }).error(function(error) {

        deferred.reject(error);

    });

    return deferred.promise;

};

function getThing(thindId) {

    var deferred = $q.defer()

    var url = someUrl + thingId;

      $http.get(url).success(function(response) {

            _myList.push(response);

            deferred.resolve(response);

      }).error(function(error) {

            deferred.reject(error);

      });       

    return deferred.promise;

};

的確,您將無法像設置一樣使用for循環填充_myList數組。 而是創建一個承諾數組-在response.array每個數據項一個,並將其作為內部承諾返回。

function getStuff() {

    var url = someUrl;

    return $http.get(url).then(function(response) {
        if (response.data.array.length > 0) {
            return $q.all(response.data.array.map(function(data) {
                return getThing(data.id);
            }));
        } else {
            return 'No stuff exists';
        }
    });
}

function getThing(thindId) {
    var url = someUrl + thingId;
    return $http.get(url).then(function(response) {
        return response.data;
    });
}

之后,您將使用getStuff像這樣:

getStuff().then(function(myList) {
    console.log(myList);
});

您可以按如下方式簡化代碼:

var allThings = response.array.map(function(id){
  var singleThingPromise = getThing(id);
  //return a single request promise
  return singleThingPromise.then(function(){
    //a getThing just ended inspect list
    console.log(_myList);
  })
});
$q.all(allThings).then(function(){
  //only resolve when all things where resolved
  deferred.resolve('Finished');
}, function(e){
  deferred.reject('Something went wrong ' + e);
});

暫無
暫無

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

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