2016-03-17 44 views
0

我簡化了代碼以解決特定問題。

我在$範圍2個功能:)singleRequest(multiReqest()multiReqest()必須調用testServer()幾次然後調用singleRequest()

問題在這個例子中:)singleRequest(前multiReqest()開始,但在同一時間的console.log( '所有的多請求的請求加載')稱爲將依次調用。 這是怎麼回事?我究竟做錯了什麼?謝謝。

function TestCtrl($scope, $q, $http) { 

//variables declaration etc 

var testServer = function (_pos) { 
    console.log('testServer:', _pos) 
    var deferred = $q.defer(); 
    $http.get(service.first, parameters).success(function (data, status, headers, config) { 
     console.log(_pos, 'request from multiRequest loaded'); 
     //do smth with data 
     deferred.resolve(); 
    }).error(function (err) { 
     deferred.reject(err); 
    }); 
    return deferred.promise; 
}; 
// 
// 
$scope.singleRequest = function() { 
    console.log('Start singleRequest function'); 
    $http.get(service.second).success(function (data, status, headers, config) { 
     console.log('Single request loaded'); 
     //do smth with data 
    }); 
}; 
// 
// 
$scope.multiRequest = function (_callback) { 
    console.log('Start multiRequest function'); 
    var promises = []; 
    for (var i = 1; i <= 3; i++) { 
     promises.push(testServer(i)); 
    } 
    $q.all(promises).then(function() { 
     console.log('All requests from multiRequest loaded'); 
     _callback; 
    }); 
}; 
// 
$scope.multiRequest($scope.singleRequest()); 
} 

控制檯日誌:

  • 開始singleRequest功能
  • 開始多請求功能
  • TESTSERVER:1
  • TESTSERVER:2
  • TESTSERVER:3
  • 單REQ被加載。 XHR加載完成:GET 「的http:// ...
  • 1 」多請求要求裝「 XHR加載完成:GET」 的http:// ...
  • 2 「多請求要求裝」。 XHR加載完成:GET 「的http:// ...
  • 3 」從多請求要求裝「 XHR加載完成:GET」 的http:// ...
  • 從多請求所有請求加載

回答

1

你不及格的回調,但實際上這裏調用函數:

$scope.multiRequest($scope.singleRequest()); // Passing return value 

所以,你應該改變,要:

$scope.multiRequest($scope.singleRequest); // Passing function 

然後將_callback;更改爲_callback();,以調用該函數。

+0

同意Knelis。 – Harpreet

+0

它的工作原理!謝謝 !在C語言將變量名稱作爲指向函數的指針後不習慣。 但是如果我需要通過參數傳遞迴調函數,例如$ scope.multiRequest(foo(bar)); ? – Archarious

+1

然後,如果在調用回調的位置未知參數,則可以將其包裝在另一個函數中。例如。 '$ scope.multiRequest(function(){foo(bar,widget);});'。 – Knelis