javascript - 循环之前等待内部代码完成

标签 javascript angularjs asynchronous

我有一个 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/

相关文章:

javascript - 复选框已选中 显示按钮

javascript - Angular JS 'route' 与 %2F 的组件不匹配(编码 '/' )

javascript - Angular Testing $httpBackend 意外请求和正则表达式未定义

c++ - std::成员函数的异步调用

Spring批处理还是Spring boot异步方法执行?

javascript - 隐藏/显示 HTML 元素还是删除/插入它更快?

javascript - Polymer 1.0 - 通过模板绑定(bind)上的嵌套数组递增。

javascript - 如何以及在何处将 JQuery 添加到 DotnetNuke(DNN) 的模块元素中?

javascript - 以 Angular 迭代可折叠 Bootstrap 数据表

scala - 在 scala.rx 中找不到 `eventually`