Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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
Javascript Angularjs-$q.所有人都没有同步履行承诺_Javascript_Angularjs - Fatal编程技术网

Javascript Angularjs-$q.所有人都没有同步履行承诺

Javascript Angularjs-$q.所有人都没有同步履行承诺,javascript,angularjs,Javascript,Angularjs,我想使用$q.all来等待函数完成。我在plunker 这是应用程序 运行(检查控制台) var-App=angular.module(“App”,[]); App.controller(“AppController”,函数($scope,$q){ $scope.xxy=函数(num){ var d=$q.defer(); for(var i=0;i$scope.xxy(i)返回一个承诺 你不能只是循环等待一个返回值。承诺不是这样的 相反,你必须这样做 $scope.xxy(num).then

我想使用$q.all来等待函数完成。我在plunker


这是应用程序
运行(检查控制台)
var-App=angular.module(“App”,[]);
App.controller(“AppController”,函数($scope,$q){
$scope.xxy=函数(num){
var d=$q.defer();
for(var i=0;i
$scope.xxy(i)
返回一个承诺

你不能只是循环等待一个返回值。承诺不是这样的

相反,你必须这样做

$scope.xxy(num).then(function(value){
      ...
});

$q.all(..)
将数组中的所有承诺包装成一个新的承诺。

问题出在您的run函数中……您当前已将其注释掉

$scope.xxy(i).then(function(r){
  console.log(r);
})
但是$q.all解析一个结果数组(按照承诺传递的顺序,所以您需要使用这个

$scope.xxy(i).then(function(r){
  console.log(r[0]); // first item of the result array
})
编辑在这里,它以更新的方式工作

来自文档() 将多个承诺组合为一个承诺,在解析所有输入承诺时解析该承诺。
返回:承诺的数组或散列。

那么,您想序列化行为:打印1,调用异步函数并打印返回值20,然后再次运行循环,打印2,然后调用异步函数等等

这确实是一个有趣的问题。对我来说,似乎你需要使用

适用于您的情况:

App.controller("AppController", function($scope,$q,$timeout) {

    $scope.xxy = function(num) {
        var d = $q.defer();

        $timeout(function() {
            d.resolve(num*20);
        }, 1000);

        return d.promise;
    };

    $scope.repeater = function(i)  {
        if (i < 10) {
            console.log(i);
            $scope.xxy(i).then(function(ret) {
                console.log(ret);
                $scope.repeater(i + 1);
            });
        }
    };

    $scope.run = function() {
        $scope.repeater(0);
    };
});
App.controller(“AppController”,函数($scope、$q、$timeout){
$scope.xxy=函数(num){
var d=$q.defer();
$timeout(函数(){
d、 解析(num*20);
}, 1000);
回报承诺;
};
$scope.repeater=函数(i){
如果(i<10){
控制台日志(i);
$scope.xxy(i).然后(函数(ret){
控制台日志(ret);
$scope.repeater(i+1);
});
}
};
$scope.run=函数(){
$scope.repeater(0);
};
});
请参阅实际操作:

我添加了
$timeout
,以演示异步行为,并能够将解析承诺放在回调所属的位置


我希望我正确地理解了您的问题。

plunker或fiddle pleaseSo,我该怎么做才能使返回承诺的函数等待完成一些代码,然后正常继续。基本上,我需要以某种方式使异步函数同步。我想要的输出是120 2 40…当前输出是12..20 40。我想将xxy函数用作synchonus调用,但我无法在我的项目中更改xxy函数的核心,因为它太大,可能会破坏其他东西。我知道,repeater基本上是一个递归函数,用普通函数替换$scope,因此angularjs范围检查不会触发。它在某种程度上解决了我遇到的问题非常感谢。
App.controller("AppController", function($scope,$q,$timeout) {

    $scope.xxy = function(num) {
        var d = $q.defer();

        $timeout(function() {
            d.resolve(num*20);
        }, 1000);

        return d.promise;
    };

    $scope.repeater = function(i)  {
        if (i < 10) {
            console.log(i);
            $scope.xxy(i).then(function(ret) {
                console.log(ret);
                $scope.repeater(i + 1);
            });
        }
    };

    $scope.run = function() {
        $scope.repeater(0);
    };
});