首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Promise发送多个API请求

使用Promise发送多个API请求
EN

Stack Overflow用户
提问于 2019-04-01 21:38:00
回答 4查看 2.5K关注 0票数 2

如何发送多个API请求?所以我有下面的代码

代码语言:javascript
运行
复制
 const productID= [12, 43, 65, 87, 45, 76, 87];
    productID.map(id => {
     API.removeItem(id, (err, response) => {
       if (response.status === 'success') {
           console.log('remove a product');
        }else {
          console.log(err); 
        }
     })
})

问题是,它不会等待第一个API请求完成并返回响应,并且只删除一个项。所以基本上我想让它同步,这就是为什么我使用async await来解决我的问题。

代码语言:javascript
运行
复制
async function removeProducts() {
    const productID = [12, 43, 65, 87, 45, 76, 87];
    const result = await Promise.all(productID.map(id => {
        API.removeItem(id, (err, response) => {
            if (response.status === 'success') {
                console.log('remove a product');
            }else {
                console.log(err); 
        }
        });
    }));
}

结果与第一个代码片段几乎相同,但这一次它能够删除2个产品项。我希望仅当前一个请求完成时才发出下一个请求。我该怎么做呢?

EN

回答 4

Stack Overflow用户

发布于 2019-04-01 21:47:37

第二次尝试的问题是Promise.all()接受一个promises数组作为参数。Promise.all()函数本身也返回一个promise,当传入的数组中的每个promise都被解析时,promise就会被解析。

array.map不返回promise,它返回一个新数组,其中包含使用所提供的函数调用的数组中每一项的结果。阅读有关地图函数here的更多信息。

相反,为返回promise的API调用创建一个包装函数。

代码语言:javascript
运行
复制
const productID = [12, 43, 65, 87, 45, 76, 87];

let removeProductID = (id) => {
    return new Promise((resolve, reject) => {
        API.removeItem(id, (err, response) => {
            if (response.status === 'success') {
                console.log('remove a product');
                resolve(response);
            } else {
                console.log(err);
                reject(err);
            }
        })
    });
}

let removeAllProductIDs = async () => {
    for(let id of productID) {
        await removeProductID(id);
    }
}

removeAllProductIDs();
票数 2
EN

Stack Overflow用户

发布于 2019-04-01 21:45:56

实际上是Promise.All()发出的并行请求,所以这不是您正在寻找的解决方案。

您需要的是让生成结果,然后发出另一个请求,依此类推。因此,你需要API.removeItem来返回 Promise .if它不是,然后你可以使用Promise.if包装这个函数来返回Promise。

代码语言:javascript
运行
复制
    async function removeItem(id) {
      return new Promise((resolve, reject) => {
        API.removeItem(id, (err, response) => {
          if (response.status === 'success') {
            resolve("message or data"); // or pass id or anything
          } else {
            console.log(err);
            reject(err)
          }
        })
      })
    }

现在您可以使用此函数来生成结果。

代码语言:javascript
运行
复制
 const productID = [12, 43, 65, 87, 45, 76, 87];
    async function removeProducts() {
       for (let i = 0; i < productID.length; i++) {
            const result = await removeItem(productID[i]); // will return resolved value here
            // sequence
          }
     }
票数 1
EN

Stack Overflow用户

发布于 2019-04-01 21:47:40

代码语言:javascript
运行
复制
const productID = [12, 43, 65, 87, 45, 76, 87];
function process() {
    if (productID.length == 0) return;

    var id = productID.pop();
    API.removeItem(id, (err, response) => {
       if (response.status === 'success') {
           console.log('remove a product');
           process(); // process next item if success
        } else {
          console.log(err); 
        }
    });
};

process();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55456516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档