仅在处理结果列表后才需要来自 $http 查询的 return 数据

Need to return data from $http query only after result list is processed

我有一个调用另一个函数的函数,它会做两件事:

  1. 它执行 http 获取以获取 ID 列表
  2. 然后遍历该 ID 列表,为每个 ID 生成另一个 http get,并将结果添加到 var 'dataList'。

我需要它 return 完全填充的数据列表作为结果,然后我可以获取该列表并对其进行处理。我知道我需要为此使用承诺,但我无法获得我正在寻找的行为。我最近的尝试如下。这确实 return 了预期的列表,但它似乎陷入了循环 - 我认为它正在为地图循环的每次迭代执行 return 。如有任何建议,我们将不胜感激。

getDataList(searchString, matchCase, rows, start).then(function(result) {
   // Do something with result
});
getDataList: function(searchString, matchCase, rows, start) {
    let body = {};
    let dataList = [];
    var url = getUrl();
    var defer = $q.defer();
    return $http.get(url).success(function(response) {
        let dataIdList = [];
        body = response.response.docs;
        body.map(function getDataId(wfr) {
            if (wfr.referenceType === 'data') {
                dataIdList.push(wfr.referenceId);
            }
        });
        dataList = dataIdList.map(function getData(dataId) {
            dataSvc.getDataDetails(dataId).then(function(response) {
                dataList.push(response);
            });
        });
        defer.resolve(dataList);
    }).error(function(result) {
        defer.reject();
    });
}

我想 Promise.all() 就是您要找的。

您可以将所有 getDataDetails(dataId) 请求作为 promises 推送到一个数组,然后仅在之后执行 Promise.all(yourPromiseArray) 和 return 您想要的操作Promise.all 已成功完成。

我强烈建议您在研究期间查看 async/await,因为它可能会很有帮助。互联网上有很多关于如何实现它的文章,如果您觉得自己被它困住了,可以查看许多 Whosebug 问题。

希望这对您有所帮助,祝您好运! :)

.success.error 方法已从 AngularJS 框架中删除。 Avoid using the deferred anti-pattern. 使用 $q.all 解析多个 AngularJS promises:

getDataList: function(searchString, matchCase, rows, start) {
    var url = getUrl();
    return $http.get(url).then(function(response) {
        let body = response.data.response.docs;
        let dataIdList = 
          body.filter(wfr => wfr.referenceType === 'data').map(_ => _.referenceId);
        let dataListPromiseArr = dataIdList.map(dataId =>  {
            return dataSvc.getDataDetails(dataId).then(function(response) {
                return response.data;
            });
        });
        return $q.all(dataListPromiseArr);
    }).catch(function(response) {
        console.log(response);
        throw response;
    });
}

有关详细信息,请参阅