首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让返回语句等待,直到函数中的其他所有内容都完成

问让返回语句等待,直到函数中的其他所有内容都完成
EN

Stack Overflow用户
提问于 2020-01-30 22:58:40
回答 1查看 316关注 0票数 2

我试图创建一个函数来返回SOAP调用的结果(结合使用npm-皂和node.js)。问题是函数返回未定义,因为到达返回语句时SOAP调用尚未完成。

我尝试将返回语句放入SOAP调用回调本身,但随后它返回了未定义的结果。我认为这是因为返回语句应该位于外部函数中,而不是内部函数中,正如我在下面的示例中所做的那样。SOAP调用中的console.log()输出正确的数据,因此我知道它在那里。

如何使返回语句等待内部SOAP调用?谢谢!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-01-30 23:12:00

让getInvoices返回一个Promise,一旦所有回调完成,您就可以解析它了。

代码语言:javascript
复制
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);
  }
})();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59995756

复制
相关文章

相似问题

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