Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我在for中调用javascript函数时,当for循环结束时,将返回该函数的所有第I个响应_Javascript_Angularjs_Arrays_Function - Fatal编程技术网

当我在for中调用javascript函数时,当for循环结束时,将返回该函数的所有第I个响应

当我在for中调用javascript函数时,当for循环结束时,将返回该函数的所有第I个响应,javascript,angularjs,arrays,function,Javascript,Angularjs,Arrays,Function,我在for中调用函数,方法如下: for(var i=0; i<$scope.staffdispensers.length; i++){ console.log($scope.staffdispensers[i].dispenser.iddispenser); restService.Enforsaleproductsbyiddispenser($scope.staffdispense

我在for中调用函数,方法如下:

for(var i=0; i<$scope.staffdispensers.length; i++){     
                        console.log($scope.staffdispensers[i].dispenser.iddispenser);
                        restService.Enforsaleproductsbyiddispenser($scope.staffdispensers[i].dispenser.iddispenser, _getnumber, _error);
                }
看这个。完成所有for循环后调用“_getnumber(response);”。 这是_getnumber函数:

Enforsaleproductsbyiddispenser: function(id, _getnumber, _error){
        var currentToken = _GetToken();

        _timerTokenControl(currentToken, _error);

        if (setupTime == null) {
            console.log("token scaduto");
            $window.location.href="login.html";
        }


        if (currentToken !== null) {
        $http({  
                    method : 'GET',  
                    url : REST_URL+'products/nforsalebyiddisp/'+id
                }).then(function successCallback(response) {  
                    _getnumber(response);
                }, function errorCallback(response) {  
                    console.log(response.statusText);  
                });  
           }  else {
                $window.location.href="login.html";
                console.log("NON SEI LOGGATO!!!");
        }
    }
function _getnumber(response){
                number.push(response.data);  
                console.log(number);

}
查看控制台,在数字数组中,我有每个I的所有函数结果:

但是如果我尝试刷新页面,我有相同的值,但顺序不同

这是因为在完成所有for循环之后调用了“_getnumber(response);”!!看看:

我想一步一步地打电话给你

在main-employee.js中:

在rest-services.js中:


您正在使用$http执行ajaxCall。这个特殊的$http调用是异步的,不能保证需要多长时间

当通话成功结束时,您正在拨打_getNumber,当您突然拨打多个电话时,第一个电话可以在最后一个电话之后完成

因此,您将无法获得保证订单

回报承诺:

if (currentToken !== null) {
            return $http({  
                    method : 'GET',  
                    url : REST_URL+'products/nforsalebyiddisp/'+id
                }).then(function successCallback(response) {  
                    _getnumber(response);
                }, function errorCallback(response) {  
                    console.log(response.statusText);  
                });  
        }  else {
                $window.location.href="login.html";
                console.log("NON SEI LOGGATO!!!");

                var def = $q.deferred();
                def.resolve();
                return def.promise;
        }
编写一个递归函数,在承诺被解析时调用它自己

    function recursiveCall(i) {
            if (i < $scope.staffdispensers.length) {
                console.log($scope.staffdispensers[i].dispenser.iddispenser);
restService.Enforsaleproductsbyiddispenser($scope.staffdispensers[i].dispenser.iddispenser, _getnumber, _error)
                .then(function(){
                    recursiveCall(i+1)
                })
            }
        }

您正在调用一个异步函数,这意味着for循环可能会在您获得所有响应之前完成。顺序取决于每个异步调用何时完成。如果需要按顺序获取数据,则需要实现一种排序响应的机制或等待调用完成。一种方法是在成功回调中再次调用fetch,直到发出所有服务器调用。

啊,是的。您知道,
$http
调用是否会以相同的顺序返回,这是不确定的。有时反应慢,有时反应快。执行命令的唯一方法是明智地使用承诺。这不难做到

您必须使用
$http
调用的返回值(这是一个承诺)来强制执行结果顺序

var promises = [];  // this will hold promises in correct order
for(var i=0; i<$scope.staffdispensers.length; i++){     
  console.log($scope.staffdispensers[i].dispenser.iddispenser);
  var promise = restService.Enforsaleproductsbyiddispenser($scope.staffdispensers[i].dispenser.iddispenser, _getnumber, _error);
  promises.push(promise);
}
您需要修改
$http
调用,以便它只返回
$http
响应:

return $http({  
         method : 'GET',  
         url : REST_URL+'products/nforsalebyiddisp/'+id
       });

问题是结果的顺序吗?如果是这样的话,您可以使用异步的for with promises。问题在于顺序!我希望这些值按顺序排列,但在本例中,顺序是随机的,这是因为http请求是异步的,因此一些请求可能会在其他请求之前完成。解决这个问题的方法主要有两种:1)带索引的正则循环。2) 一个有承诺的异步循环。词法范围界定人。Google it。可能的重复以及我如何做?一种不需要承诺和等待的简单方法是传递异步调用响应应该对应的索引。初始化长度数组
$scope.staffdispenders.length
,然后设置
arr[i]=response.data
。缺点是,您不知道所有异步调用何时完成。您需要让函数返回一个承诺,并在承诺得到解决时执行另一个调用,请检查更新后的应答,您需要同步调用,以保证我在示例中使用的控制台日志的顺序,然后再进行递归调用,该调用只在成功时调用自身……请注意,我没有费心处理失败的案例。。这就是幸福之路。。但这应该能同步你所有的电话。。让我知道它是否奏效。。。干杯!这正确地解决了我的问题!非常感谢你
$q.all(promises).then(function(arrayOfPromises) {  //array is of all resolved promises
  angular.forEach(arrayOfPromises, function(promise) {
    promise.then(function(response) {
      _getnumber(response);
    })
    .catch(function(error) {
    });
  });
});
return $http({  
         method : 'GET',  
         url : REST_URL+'products/nforsalebyiddisp/'+id
       });