我正在尝试创建一个返回SOAP调用结果的函数(将npm-soap与node.js结合使用)。问题在于该函数返回的是未定义的,因为到达return语句时SOAP调用尚未完成。
我尝试将return语句放入SOAP调用回调本身中,但是随后返回undefined。我认为这是因为return语句应该位于外部函数而不是内部函数中,就像我在下面的示例中所做的那样。 SOAP调用回调中的console.log()输出正确的数据,所以我知道它在那里。
如何使return语句在内部SOAP调用上等待?谢谢!
var config = require('./config.js');
var soap = require('soap');
function getInvoices() {
let invoices;
// Connect to M1
soap.createClient(config.endpoint, function(err, client) {
// Log in
client.login(
{
username: config.username,
apiKey: config.password
},
function(err, loginResult) {
// Get invoices
client.salesOrderInvoiceList(
{
sessionId: loginResult.loginReturn.$value
},
function(err, invoiceResult) {
// Save invoices
invoices = invoiceResult;
console.log(invoices); // <- Returns the right data
// Log out
client.endSession(
{
sessionId: loginResult.loginReturn.$value
},
function(err, logoutResult) {
}
);
}
);
});
});
// Return invoices
return invoices; // <- Returns undefined
}
console.log(getInvoices(); // <- So this returns undefined as well
最佳答案
让getInvoices
返回一个Promise
,一旦所有回调完成即可以解决该问题。
function getInvoices() {
return new Promise((resolve, reject) => {
// Connect to M1
soap.createClient(config.endpoint, (err, client) => {
if (err) return reject(err);
// Log in
client.login({
username: config.username,
apiKey: config.password
}, (err, loginResult) => {
if (err) return reject(err);
// Get invoices
client.salesOrderInvoiceList({
sessionId: loginResult.loginReturn.$value
}, (err, invoiceResult) => {
if (err) return reject(err);
// Log out & resolve the Promise
client.endSession({
sessionId: loginResult.loginReturn.$value
}, (err, logoutResult) =>
err ? reject(err) : resolve(invoiceResult)
);
});
});
});
}
...
(async () => {
try {
const invoices = await getInvoices();
console.log(invoices);
} catch (e) {
console.error(e);
}
})();
关于javascript - 使return语句等待,直到函数中的所有其他操作完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59995756/