javascript forEach on array inside promise

时间:2018-06-02 12:08:28

标签: javascript arrays rest foreach promise

在我的javascript函数中,我可以在promise中调用rest服务。

function update(item) {
  return new Promise(function (resolve, reject) {
    client.get(urls[env] + item['itemId'], function (data, response) {
        try {......

现在,当我修改相同的函数来处理项目数组时:

function update(itemList) {
  return new Promise(function (resolve, reject) {
    itemList.forEach((item) =>{
        client.get(urls[env] + item['itemId'], function (data, response) {
            try {

这不起作用。休息电话不会发生。它既没有失败。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

您可以尝试编写一个函数,该函数将返回client.get的承诺而不是回调。

以下代码显示了如何执行此操作,我使用的是ES5,但假设是本机Promises或polyfill:

function promiseClientGet(o, url){
  return new Promise(function(resolve,reject){
    o.get(url, function (data, response) {
      // try {...... need to call resolve or reject
    });
  });
}

function update(itemList) {
  return Promise.all(itemList.map(function(item) {
    return promiseClientGet(urls[env] + item['itemId'], client);
  }))
}

使用ES6:

const promiseClientGet = (o, url) => new Promise((resolve,reject)=> {
  o.get.apply(o, (data, response) => {
    // try {...... need to call resolve or reject
  });
});

const update = itemList =>
  Promise.all(itemList.map(item => promiseClientGet(urls[env] + item['itemId'], client)));

答案 1 :(得分:0)

如果您只是想要发出并行请求并等待所有请求完成并返回结果,那么您可以使用Promise.all()

const getAll = (items) =>
    Promise.all(items.map(i => callApi(i)))

getAll([1, 2, 3])
    .then(results => console.log(results))