Javascript Angularjs-$q.所有人都没有同步履行承诺
我想使用$q.all来等待函数完成。我在plunkerJavascript 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
这是应用程序
运行(检查控制台)
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);
};
});