将每个循环的API调用转换为Promise

时间:2017-06-09 10:58:32

标签: javascript promise

我有一个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()。我怎样才能为此创造一个承诺,以便它实现我想要实现的目标?

3 个答案:

答案 0 :(得分:1)

只要您使用promises,就必须链接所有依赖于promise的内容(如果您的环境支持,请使用awaitasync):

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