Promise All 中的 Node Js 循环不等待从 SOAP 获取请求
Node Js loop in Promise All not waiting to get request from SOAP
嗨,我尝试使用 for for 循环数据并将请求发送到 soap 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,但有时它会停止显示错误
类型错误:无法读取未定义的 属性 'getDataFromAPI'
有时 return 来自 api 的响应。我没有在 soap 中使用 async,await 的原因是因为我尝试将 soap 函数更改为 async 函数但是它不起作用。
apiSend()
存在以下问题:
- 您忽略了两个回调错误。
- 你从不
resolve()
或reject()
你return的承诺。
你可以这样修复:
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()
中你有一些问题:
- 对静态值数组使用
Promise.all()
毫无意义。只有当你向它传递一个至少包含一个 promise 的数组时,它才会做一些有用的事情。
- 没有
i
或 args
的声明
- 您没有对
apiSend()
的承诺 return 做任何事情
不太清楚你在这里想做什么,但是如果你想 thisIsFunc()
到 return 一个承诺,它用对 [=12 的所有调用的结果数组来解析=], 可以这样构造:
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()
将承诺数组中的所有结果收集到一个结果数组中,该结果数组是单个 returned 承诺的解析值。
您似乎试图将 thisIsFunc()
声明为 Express 请求处理程序。您可以这样做,但随后您需要通过发送成功和错误条件的响应来完成该函数内的请求。正如我在上面所示,这是一个辅助函数,它检索一组数据,然后 return 是一个解析为结果数组的承诺。您可以根据需要在请求处理程序中使用它,或者您可以向其添加更多代码以使其成为请求处理程序,该请求处理程序向传入请求发送响应并适当地 returns 错误响应。
嗨,我尝试使用 for for 循环数据并将请求发送到 soap 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,但有时它会停止显示错误 类型错误:无法读取未定义的 属性 'getDataFromAPI'
有时 return 来自 api 的响应。我没有在 soap 中使用 async,await 的原因是因为我尝试将 soap 函数更改为 async 函数但是它不起作用。
apiSend()
存在以下问题:
- 您忽略了两个回调错误。
- 你从不
resolve()
或reject()
你return的承诺。
你可以这样修复:
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()
中你有一些问题:
- 对静态值数组使用
Promise.all()
毫无意义。只有当你向它传递一个至少包含一个 promise 的数组时,它才会做一些有用的事情。 - 没有
i
或args
的声明
- 您没有对
apiSend()
的承诺 return 做任何事情
不太清楚你在这里想做什么,但是如果你想 thisIsFunc()
到 return 一个承诺,它用对 [=12 的所有调用的结果数组来解析=], 可以这样构造:
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()
将承诺数组中的所有结果收集到一个结果数组中,该结果数组是单个 returned 承诺的解析值。
您似乎试图将 thisIsFunc()
声明为 Express 请求处理程序。您可以这样做,但随后您需要通过发送成功和错误条件的响应来完成该函数内的请求。正如我在上面所示,这是一个辅助函数,它检索一组数据,然后 return 是一个解析为结果数组的承诺。您可以根据需要在请求处理程序中使用它,或者您可以向其添加更多代码以使其成为请求处理程序,该请求处理程序向传入请求发送响应并适当地 returns 错误响应。