节点肥皂客户端和回调的范围



我正在使用 milewise 的 node-soap 客户端(顺便说一下创建 API),但我很难将回调的结果发送到正确的范围。

这是我现在的代码:

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 也是异步调用的,因此它也不能返回值,因此您必须对其应用相同的技术。

异步模块可以使这种事情变得更容易:特别是,当你有一堆必须按顺序运行的函数时,它的"瀑布"模式很有用,每个函数都从前一个函数中回调。

最新更新