我希望执行for循环,然后结果将通过下一个函数发送:
FindIdsRequests = function(){
results = $scope.requests
var deferred = $q.defer();
var promise = deferred.promise;
var array = []
for (var i in results) {
promise = promise.then(function(){
array.push(results[i].uid)
})
return promise
}
return promise.then(function(){
return array
})
}
$scope.ConfirmRequests = function(){
//alert('req'+JSON.stringify($scope.requests))
FindIdsRequests().then(function(array){
alert('arr'+JSON.stringify(array))
})
})
FindIdsRequests函数应返回for循环的结果,但是没有返回(警报未打印,因此不会到达那里)。有什么想法吗?
答案 0 :(得分:2)
您可以利用Breadth-First-Search(Graph, root):
2
3 for each node n in Graph:
4 n.distance = INFINITY
5 n.parent = NIL
6
7 create empty queue Q
8
9 root.distance = 0
10 Q.enqueue(root)
11
12 while Q is not empty:
13
14 current = Q.dequeue()
15
16 for each node n that is adjacent to current:
17 if n.distance == INFINITY:
18 n.distance = current.distance + 1
19 n.parent = current
20 Q.enqueue(n)
返回承诺的方式:
$q
例如:
$q.all([promise1, promise2]);
此代码将返回要解析的数组中所有promisses的promisse。
答案 1 :(得分:2)
问题:
promise
...所以只有一个promise
then()
,因此数组将始终为空return
所以循环会在第一次迭代时中断并且永远不会完成i
将不会是您认为它在then()
内的内容,因为它会在承诺结算之前到达它我认为没有必要在代码中写这个,因为你所做的一切都是同步的,并且首先不需要承诺
答案 2 :(得分:0)
好的还要感谢@charlietlf的评论以下代码:
FindIdsRequests = function(){
results = $scope.requests
var deferred = $q.defer();
var promise = deferred.promise;
var array = []
for (var i in results) {
alert('www'+JSON.stringify(results[i].uid))
var obj = results[i].uid
promise = promise.then(function(){
array.push(results[i].uid)
})
//return promise
}
deferred.resolve(array)
return promise.then(function(){
alert('ee'+JSON.stringify(array))
return array
})
}
基本上我忘记了决心。
答案 3 :(得分:0)
使用$.when
创建一个空承诺并使用for
循环创建一个链:
function chainPromiseArray(promiseArray){
var promise = $q.when();
var array = [];
for (var i=0; i < promiseArray.length; i++) {
promise = promise.then(function(){
var derivedPromise = promiseArray[i].then(function(result) {
//push data
array.push(result.data);
});
//return promise to chain
return derivedPromise;
});
};
var finalPromise = promise.then(function(){
return array;
});
return finalPromise;
};
上面的示例以空承诺开头,然后从空承诺链接。最终的承诺将解析为链创建的数组。
链接承诺
因为调用promise的
.then
方法会返回一个新的派生promise,所以很容易创建一个promise链。可以创建任何长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。这使得实现强大的API成为可能。
该示例按顺序执行promise。要并行执行承诺,请使用$q.all method。
答案 4 :(得分:0)
你的FindIdsRequests()
函数在代码中没有异步元素如图所示它只能是一个同步函数,事实上,尝试在其中使用promise只会使一个非常简单的操作复杂化:
// get an array of uid from $scope.requests
function FindIdsRequests() {
return $scope.requests.map(function(item) {
return item.uid;
});
});
$scope.ConfirmRequests = function() {
var ids = FindIdsRequests();
console.log('arr: '+ JSON.stringify(ids));
})