【问题标题】:Node Js loop in Promise All not waiting to get request from SOAPPromise All 中的 Node Js 循环不等待从 SOAP 获取请求
【发布时间】:2021-02-23 13:56:43
【问题描述】:

您好,我尝试使用 for 循环数据并向肥皂 api 发送请求。问题是我的程序似乎没有等待从soap请求中获取请求

这是我的示例数据

 data = [
      {
        store: "store1",
        product: "product2",
      },
      {
        store: "store2",
        product: "product3",
      }
    ]
exports.thisIsFunc = async (req, res, next) => {
   Promise.all(data).then(result => {
      for (let item of result) {
        i++
        console.log(i)
        args.CustomerCode = item.store
        args.ItemNo = item.product
        const getApi = apiSend()
      }
    });
 }



export function apiSend() {
  return new Promise ((resolve, reject) => {
    soap.createClient(url, (err, client) => {
      client.getDataFromAPI(args, (err, result) => {
        console.log(result)
        return result
      })
    });
  });
}

如你所见,我尝试在 sendApi 函数中使用新的 Promise,但有时它会停止出现错误 TypeError:无法读取未定义的属性“getDataFromAPI”

有时它会从 api 返回响应。我没有使用异步的原因,在soap中等待是因为我尝试将soap函数更改为异步函数但它不起作用。

【问题讨论】:

  • 这段代码的各种问题。您的错误处理为零(忽略 createClientgetDataFromAPI() 中的错误)。你不会在你的 promise 包装器中调用 resolve()reject(),这样 promise 永远不会解决或拒绝。当您调用apiSend() 时,您不会对它返回的承诺做任何事情。那么,您对Promise.all(data) 的使用是不合适的。 Promise.all() 仅在您向其传递一组 Promise 而非静态数据时才会做一些有用的事情。

标签: node.js soap async-await promise es6-promise


【解决方案1】:

apiSend()有以下问题:

  1. 您忽略了这两个回调错误。
  2. 你永远不会resolve()reject()你回报的承诺。

你可以这样修复它:

export function apiSend() {
  return new Promise ((resolve, reject) => {
    soap.createClient(url, (err, client) => {
      if (err) return reject(err);
      client.getDataFromAPI(args, (err, result) => {
        if (err) return reject(err);
        console.log(result)
        resolve(result);
      })
    });
  });
}

那么,在thisIsFunc() 你有很多问题:

  1. 在静态值数组上使用Promise.all() 毫无意义。只有当你传递一个包含至少一个 promise 的数组时,它才会做一些有用的事情。
  2. 没有iargs 的声明
  3. 你不会对来自apiSend()的承诺返回做任何事情

目前还不清楚您要在这里做什么,但是如果您希望 thisIsFunc() 返回一个承诺,该承诺会使用来自所有对 apiSend() 的调用的结果数组进行解析,那么结构可以如下所示:

exports.thisIsFunc = () => {
   return Promise.all(data.map(item => {
       let args = {
           CustomerCode: item.store, 
           ItemNo: item.product
       };
       return apiSend(args);
   }));
 }

此实现使用data.map() 迭代数组并通过调用apiSend() 创建一个promise 数组。然后它使用Promise.all() 将所有结果从承诺数组收集到一个结果数组中,该数组是单个返回的承诺的解析值。

您似乎试图将 thisIsFunc() 声明为 Express 请求处理程序。您可以这样做,但是您需要通过发送成功和错误条件的响应来完成该函数内的请求。正如我在上面所展示的,这是一个辅助函数,它检索一组数据,然后返回一个解析为结果数组的 Promise。您可以根据需要在请求处理程序中使用它,或者您可以向它添加更多代码以使其成为请求处理程序,该请求处理程序向传入请求发送响应并适当地返回错误响应。

【讨论】:

  • 您的评论对我非常有用,非常非常适合您。
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 2018-06-09
  • 2018-02-12
  • 2018-01-06
  • 2020-12-07
相关资源
最近更新 更多