我有一个forEach
循环的API调用,我需要在调用另一个函数之前完成。它看起来像这样:
var getTypes = function() {
var stations = [];
stationservice.getCount('/stations')
.then(succCB, errorCB);
function succCB(data) {
data.data.forEach(function(station) {
stations.push({
id: station._id,
})
})
};
// This should only be called once the forEach Loop is done
processStations(stations);
}
我无法找到一个可理解的示例,说明如何在循环完成后确保调用processStations()
。我怎样才能为此创造一个承诺,以便它实现我想要实现的目标?
答案 0 :(得分:1)
只要您使用promises,就必须链接所有依赖于promise的内容(如果您的环境支持,请使用await
和async
):
function getTypes() {
return stationservice.getCount('/stations')
.then(function(data) {
var stations = [];
data.data.forEach(function(station) {
stations.push({
id: station._id,
})
})
return stations;
})
.then(processStations);
}
如果getTypes
应该返回取决于getTypes
的内容,至少应该从stationservice.getCount
返回Promise链。
而不是forEach
您可能想要使用map
,因为这是您实际执行的操作:
function getTypes() {
return stationservice.getCount('/stations')
.then(function(data) {
return data.data.map(function(station) {
return {
id: station._id,
};
})
})
.then(processStations);
}
答案 1 :(得分:0)
如果你想要一个“现代代码”答案
var getTypes = function() {
return stationservice.getCount('/stations')
.then(data => data.data.map(({_id: id}) =>({id})))
.then(processStations);
}
这等于
var getTypes = function getTypes() {
return stationservice.getCount('/stations').then(function (data) {
return data.data.map(function (_ref) {
return { id: _ref._id };
});
}).then(processStations);
};
但是,因为地图根本不是异步的
const getTypes = () => stationservice.getCount('/stations').then(data => processStations(data.data.map(({_id: id}) =>({id}))));
很好 - 在现代浏览器中
var getTypes = function getTypes() {
return stationservice.getCount('/stations').then(function (data) {
return processStations(data.data.map(function (_ref) {
return { id: _ref._id };
}));
});
};
答案 2 :(得分:-1)
使用异步库
async.forEach(data.data, function (item, callback){
stations.push({
id: item._id,
})
callback();
}, function(err) {
processStations(stations);
});