【问题标题】:Trouble getting Angular-JS to wait for async call before proceeding无法让 Angular-JS 在继续之前等待异步调用
【发布时间】:2014-09-01 02:20:48
【问题描述】:

所以我知道您需要在 Angular 中使用 Promise 来管理异步,但我不太确定在这种情况下如何做到这一点。

function getLineGraphData(promises){
    var points = [];
    for (var i = 0; i < promises.length; i++) {
        $http.get('/file/tsDataPoints/'+promises[i].unit+"?startDate="+promises[i].startTs+"&endDate="+promises[i].endTs+"&startState="+promises[i].startState+"&endState="+promises[i].endState).success(function(data){
            points.push(data);
            console.log(data);
        });
    }
    console.log(points);
    return points;
}

我认为让我失望的是我用来构建查询的数据位于数组中。所以我不仅仅需要从一个请求中获得回报。会有几个。我需要做什么?例子会很有帮助。谢谢。

【问题讨论】:

  • 你不能从这个函数返回points数组并期望它包含来自异步请求的数据。
  • 我知道,但是如何让点数组包含数据?
  • 你不能。这是不可能的。它总是在 ajax 请求完成之前返回。相反,您需要返回一个承诺,或使用回调。 $q.all 将有助于在所有请求完成后返回一个已解决的承诺。
  • 好的。你有没有一个例子说明 promise 可以使用这种用法?

标签: javascript ajax angularjs


【解决方案1】:

$http 返回一个承诺。 $q.all 接受一系列承诺,并在所有承诺都解决后解决。所以可以:

promises = promises.map(function(promise){
    return $http.get('/file/tsDataPoints/'+promise.unit+"?startDate="+promise.startTs+"&endDate="+promise.endTs+"&startState="+promise.startState+"&endState="+promise.endState);
});

$q.all(promises).then(function(resultsArray){
    console.log(resultsArray); // array of results of all your $http's
});

更新:
如果你需要从你的函数中返回它,你可以

function getLineGraphData(promises){
    promises = promises.map(function(promise){
        return $http.get('/file/tsDataPoints/'+promise.unit+"?startDate="+promise.startTs+"&endDate="+promise.endTs+"&startState="+promise.startState+"&endState="+promise.endState);
    });        
    return $q.all(promises);
}

然后这样称呼它

getLineGraphData(promisesArr).then(function(resultsArray){ 
    // do your stuff
});

【讨论】:

  • 我收到一个错误,不能接受令牌“i”,因为我有 promise[i],以获取每个数组对象中的值。我将如何在您创建的没有循环的函数中遍历它们?
  • 是的,抱歉,我的错误 - 忘记将 promises[i]. 替换为 promise.,我已经更新了代码。
  • Array.map() - 实际上是一个循环,它返回一个修改后的值数组。
猜你喜欢
  • 2017-11-14
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2018-11-28
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多