2016-03-17 46 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