gpt4 book ai didi

javascript - Angularjs - $q.all 没有以同步方式兑现 promise

转载 作者:行者123 更新时间:2023-12-02 16:40:27 25 4
gpt4 key购买 nike

我想使用 $q.all 来等待函数完成。我在 plunker <a href="http://plnkr.co/edit/uG2JujPqoiBgqtRjEZwh?p=preview" rel="noreferrer noopener nofollow">http://plnkr.co/edit/uG2JujPqoiBgqtRjEZwh?p=preview</a> 中有一个例子

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.28/angular.min.js"></script>
</head>
<body ng-app="App">
<div ng-controller="AppController">
Its the app
<button ng-click="run()">Run (check console)</button>
</div>

<script>
var App = angular.module("App", []);
App.controller("AppController", function($scope,$q){

$scope.xxy = function(num){
var d = $q.defer();
for(var i=0;i<100000;i++){
//do nohing
}
d.resolve(num*20);

var promise = d.promise;

return $q.all([promise]).then(function(data){
return data;
});

};

$scope.run = function(){
for(var i=0;i<10;i++){
console.log(i);
console.log($scope.xxy(i));
//$scope.xxy(i).then(function(r){
// console.log(r);
//})
}
};
});

</script>
</body>
</html>

函数xxy()是以异步方式编写的,但我希望它使用$q同步。全部。无法改变 xxy 函数的性质,因为它会破坏我的大项目中的其他内容。xxy() 是我正在使用的一个大函数的简单版本,它使用 $q.defer 构建。

所以基本上我希望输出为: 1 20 2 40... 而不是当前的 1 2 .. 20 40...

最佳答案

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

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

适用于您的案例:

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);
};
});

查看实际操作:JSFiddle .

我添加了 $timeout 来演示异步行为,并能够将 promise 解析到它所属的回调中。

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

关于javascript - Angularjs - $q.all 没有以同步方式兑现 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27548304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com