仅在处理结果列表后才需要来自 $http 查询的 return 数据
Need to return data from $http query only after result list is processed
我有一个调用另一个函数的函数,它会做两件事:
- 它执行 http 获取以获取 ID 列表
- 然后遍历该 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;
});
}
有关详细信息,请参阅
我有一个调用另一个函数的函数,它会做两件事:
- 它执行 http 获取以获取 ID 列表
- 然后遍历该 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 框架中删除。$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;
});
}
有关详细信息,请参阅