Node.js 节点soap客户端和回调的作用域

Node.js 节点soap客户端和回调的作用域,node.js,soap,asynchronous,callback,Node.js,Soap,Asynchronous,Callback,我使用的是nodesoap客户机from(顺便说一句,是createapi),但是要将回调的结果返回到正确的范围,我有一些困难 以下是我目前掌握的代码: function generateSoapRequest(req, res, next) { soap.createClient('http://127.0.0.1:' + cfg.service_port + cfg.service_url_path, function(err, client) { clie

我使用的是nodesoap客户机from(顺便说一句,是createapi),但是要将回调的结果返回到正确的范围,我有一些困难

以下是我目前掌握的代码:

function generateSoapRequest(req, res, next)
{ 
    soap.createClient('http://127.0.0.1:' + cfg.service_port + cfg.service_url_path,
    function(err, client) {
        client.CXIf.CXIf.CXProcessXML(
            {"XMLRequestData": {"CXLogon": {"UserID":"1901007", "Password":"2580", "LogonType":11 } } }, 
            function(err, result, body) {
            if (err) {
                console.log(err);
                return;
            }
            console.log(result);

            var cxresponse = result.XMLResponse[0].CXResponse;
            console.log('SessionID:' + cxresponse.SessionID + ' SessionInstanceID:' + cxresponse.SessionInstanceID);
        });
    });
}

function getVoiceMailInformation(req, res, next) {
    var cxresponse = generateSoapRequest(req, res, next);
    var something = doSomethingNext(cxresponse);
}

function doSomethingNext(cxresponse){....; return something;}
基本上,当我启动getVoiceMailInformation()时,它会创建一个soap客户端,并通过generateSoapRequest()请求一些信息。 下一步是获得该函数的结果(在上面的代码中没有实现,因为我不知道如何实现),然后执行其他操作

我的问题是soap.createClient是异步的,因此回调在函数完成后很好地被激发

最好的方法是什么? (也许这是一件微不足道的事情,但javascript中匿名函数的作用域却让我心痛不已。)


任何帮助都将不胜感激。

基本上你不能做以下事情:

var cxresponse = generateSoapRequest(req, res, next);
因为您调用的函数调用异步代码,因此无法返回由该代码确定的值。解决这个问题的正常方法是为函数提供一个额外的回调参数,一旦结果可用,该参数将随结果一起调用。它不必是匿名函数;它可以是一个命名函数。在您的例子中,(假设您修改了
generateSoapRequest
以回调作为其第四个参数,并在结果就绪时调用它,您可以编写

generateSoapRequest(req, res, next, doSomethingNext);
然后,
doSomethingNext
将以
cxresponse
作为参数调用。当然,由于
doSomethingNext
也会被异步调用,因此它也不能返回值,因此您必须对其应用相同的技术


async模块可以使这类事情变得更简单:特别是,当您有一组必须按顺序运行的函数时,它的“瀑布”模式非常有用,每个函数都是从上一个函数调用回来的。

非常有用,我来看看async。