只有在处理结果列表后,才需要从查询中返回数据$http



我有一个函数调用另一个函数,然后做两件事:

  1. 它确实会获取 http 获取 ID 列表
  2. 然后,它遍历该 ID 列表,为每个 ID 制作另一个 http get,并将结果添加到 var 'dataList' 中。

我需要让它返回完全填充的 dataList 作为结果,然后我可以获取该列表并对其进行处理。我知道我需要为此使用承诺,但我无法获得我正在寻找的行为。我的最新尝试如下。这确实返回了预期的列表,但随后它似乎卡在一个循环中 - 我认为它正在为地图循环的每次迭代做一个返回。任何建议将不胜感激。

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();
});
}

.success.error方法已从 AngularJS 框架中删除。1避免使用延迟反模式。2使用$q.all解析多个 AngularJS 承诺:

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;
});
}

有关详细信息,请参阅

  • AngularJS $q Service API 参考 - $q.all

我认为Promise.all((就是你要找的。

您可以将所有getDataDetails(dataId)请求作为promise推送到数组,然后执行Promise.all(yourPromiseArray),只有在成功完成Promise.all后才返回您想要的内容。

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

希望这有帮助,祝你好运! :)

最新更新