为了账号安全,请及时绑定邮箱和手机立即绑定

无需使用 Axios 嵌套在 Node.js 中同步进行多个 Web api 调用

无需使用 Axios 嵌套在 Node.js 中同步进行多个 Web api 调用

MMTTMM 2023-04-27 16:28:19
有什么办法可以让下面的代码同步运行,我可以获取所有 productLine id,然后遍历并删除所有这些,然后一旦所有这些都完成,获取所有 productId,然后循环通过并删除所有这些?我真的很想能够批量删除每组项目,但是下一节要等到第一节完成后才能运行,否则会出现引用完整性问题。// Delete Product Linesaxios.get('https://myapi.com/ProductLine?select=id')    .then(function (response) {        const ids = response.data.value        ids.forEach(id => {            axios.delete('https://myapi.com/ProductLine/' + id)        })    })    .catch(function (error) {    })// Delete Products (I want to ensure this runs after the above code)axios.get('https://myapi.com/Product?select=id')    .then(function (response) {        const ids = response.data.value        ids.forEach(id => {            axios.delete('https://myapi.com/Product/' + id)        })    })    .catch(function (error) {    })
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您的代码中有很多重复项。为了减少代码重复,您可以创建一个可以使用适当参数调用的辅助函数,该辅助函数将包含删除产品线和产品的代码。


async function deleteHelper(getURL, deleteURL) {

   const response = await axios.get(getURL);

   const ids = response.data.value;


   return Promise.all(ids.map(id => (

      axios.delete(deleteURL + id)

   )));

}

有了这个辅助函数,现在您的代码将得到简化并且没有代码重复。


现在要达到预期的结果,您可以使用以下方法之一:


不要使用两个单独的承诺链,而只使用一个删除产品线然后删除产品的承诺链。


const prodLineGetURL = 'https://myapi.com/ProductLine?select=id';

const prodLineDeleteURL = 'https://myapi.com/ProductLine/';


deleteHelper(prodLineGetURL, prodLineDeleteURL)

  .then(function() {

     const prodGetURL = 'https://myapi.com/Product?select=id';

     const prodDeleteURL = 'https://myapi.com/Product/';

     deleteHelper(prodGetURL, prodDeleteURL);

  })

  .catch(function (error) {

      // handle error

  });

使用async-await语法。


async function delete() {

   try {

     const urls = [

        [ prodLineGetURL, prodLineDeleteURL ],

        [ prodGetURL, prodDeleteURL ]

     ];


     for (const [getURL, deleteURL] of urls) {

        await deleteHelper(getURL, deleteURL); 

     }


   } catch (error) {

     // handle error

   }

}

您可以在代码中改进的另一件事是使用Promise.all而不是forEach()方法来发出删除请求,上面的代码使用Promise.all内部deleteHelper函数。


查看完整回答
反对 回复 2023-04-27
?
桃花长相依

TA贡献1860条经验 获得超8个赞

您的代码(以及所有其他答案)正在delete按顺序执行请求,这是对时间的巨大浪费。Promise.all()您应该并行使用和执行...


// Delete Product Lines

axios.get('https://myapi.com/ProductLine?select=id')

    .then(function (response) {

        const ids = response.data.value


        // execute all delete requests in parallel

        Promise.all(

          ids.map(id => axios.delete('https://myapi.com/ProductLine/' + id))

        ).then(

          // all delete request are finished

        );        

    })

    .catch(function (error) {


    })


查看完整回答
反对 回复 2023-04-27
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

所有 HTTP 请求都是异步的,但您可以使其类似同步。如何?使用异步等待


假设您有一个名为 的函数retrieveProducts,您需要创建该函数async然后await让响应继续处理。


留给:


const retrieveProducts = async () => {


// Delete Product Lines

const response = await axios.get('https://myapi.com/ProductLine?select=id')

const ids = response.data.value

ids.forEach(id => {

  axios.delete('https://myapi.com/ProductLine/' + id)

})


// Delete Products (I want to ensure this runs after the above code)

const otherResponse = await axios.get('https://myapi.com/Product?select=id') // use proper var name

const otherIds = response.data.value //same here

otherIds.forEach(id => {

  axios.delete('https://myapi.com/Product/' + id)

})

}

但请记住,它不是同步的,它一直是异步的


查看完整回答
反对 回复 2023-04-27
  • 3 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信