【问题标题】:$q defer in angular$q 角度延迟
【发布时间】:2016-03-17 09:45:14
【问题描述】:

我简化了代码来解决一个特定的问题。

我在 $scope 有 2 个函数:singleRequest()multiReqest()multiReqest() 必须调用 testServer() 几次,然后再调用 singleRequest()

本例中的问题:singleRequest()multiReqest() 启动之前调用,但同时 console.log('所有来自 multiRequest 的请求已加载') 依次调用。 为什么会这样?我究竟做错了什么?谢谢。

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 函数
  • 启动多请求功能
  • 测试服务器:1
  • 测试服务器:2
  • testServer: 3
  • 已加载单个请求。 XHR 完成加载:GET "http://...
  • 1“来自 multiRequest 的请求已加载”。 XHR 完成加载:GET "http://...
  • 2“来自 multiRequest 的请求已加载”。 XHR 完成加载:GET "http://...
  • 3“来自 multiRequest 的请求已加载”。 XHR 完成加载:GET "http://...
  • 已加载来自 multiRequest 的所有请求

【问题讨论】:

    标签: javascript angularjs q angular-promise


    【解决方案1】:

    您不是在传递回调,而是在此处实际调用函数:

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

    所以你应该把它改成:

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

    然后将_callback;改为_callback();,调用该函数。

    【讨论】:

    • 有效!谢谢 !不习惯在 C 语言中将变量名作为指向函数的指针传递。但是如果我需要传递带有参数的回调函数,例如 $scope.multiRequest (foo (bar)); ?
    • 如果参数不知道调用回调的位置,你可以将它包装在另一个函数中。例如。 $scope.multiRequest(function () { foo(bar, widget); });.
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2013-09-27
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多