$q以棱角分明的方式推迟

$q defer in angular

本文关键字:方式 推迟      更新时间:2023-09-26

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

我在$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());
}

控制台日志:

  • 启动单个请求函数
  • 启动多请求功能
  • 测试服务器:1
  • 测试服务器:2
  • 测试服务器:3
  • 加载单个请求。XHR 完成加载:获取"http://...
  • 1 个"来自多请求的请求已加载"。XHR 完成加载:获取"http://...
  • 2 "来自多请求的请求已加载"。XHR 完成加载:获取"http://...
  • 3 "来自多请求的请求已加载"。XHR 完成加载:获取"http://...
  • 已加载来自多请求的所有请求

你不是在传递回调,而是在这里实际调用函数:

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

因此,您应该将其更改为:

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

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