我有一个 for 循环,我想运行 10 次。它从我的服务器上下载一个 3MB 的文件,然后返回所花费的时间(以毫秒为单位),我将执行 10 次,并将平均值作为客户端的下载速度。
但是,当我运行这个循环时:
$scope.startTest = function () {
var dlTime = 0;
for (var i = 0; i < 10; i++) {
var wait = getLargeData();
wait.then(function(result) {
dlTime += result.dlTime;
$scope.message += "\n finished loop " + i;
});
}
$scope.message += "\n Total download time: " + dlTime;
}
它打印出以下内容:
finished loop 10
finished loop 10
finished loop 10
finished loop 10
finished loop 10
finished loop 10
finished loop 10
finished loop 10
finished loop 10
finished loop 10
Total download time: 0
我知道我的问题与异步有关,但如何让循环在继续之前等待 .then 调用?
编辑:getLargeData() 确实返回一个 promise
function getLargeData() {
var loadTime = 0;
var dlSpeed = 0;
var promise = $q.defer();
var startTime = new Date();
$networkSvc.getLargeData()
.success(function (data) {
loadTime = new Date() - startTime;
dlSpeed = 3 / (loadTime / 1000);
var ret = { loadTime: loadTime, dlSpeed: dlSpeed };
promise.resolve(ret);
return promise.promise;
})
.error(function() {
$scope.message = "Error - could not contact server.";
});
return promise.promise;
}
最佳答案
使用$q.all
let promises = [promiseAlpha(), promiseBeta(), promiseGamma()];
$q.all(promises).then((values) => {
console.log(values[0]); // value alpha
console.log(values[1]); // value beta
console.log(values[2]); // value gamma
complete();
});
它接受 promise 数组,值是已完成 promise 的数组。 Here是关于的。
你写的代码写了10次10,因为那是等待数据的 promise ,但i变量在完成之前就结束了。 q.all就是为了解决这十个 promise 。您可以在此范围内进行迭代。
关于javascript - 循环之前等待内部代码完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31432507/