1

我正在使用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 中匿名函数的范围是让我很生气的东西。)

任何帮助将不胜感激。

4

1 回答 1

0

基本上你不能做这样的事情:

var cxresponse = generateSoapRequest(req, res, next);

因为您正在调用的函数调用异步代码,因此无法返回由该代码确定的值。解决此问题的正常方法是为函数提供一个额外的回调参数,该参数将在结果可用时随结果一起调用。它不一定匿名函数;它可以是一个命名函数。在您的情况下,(假设您已修改generateSoapRequest为将回调作为其第四个参数并在结果准备好时调用它,您可以编写

generateSoapRequest(req, res, next, doSomethingNext);

然后doSomethingNextcxresponse作为参数调用。当然,由于doSomethingNext也是异步调用的,它也不能返回值,所以你必须对它应用相同的技术。

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

于 2012-08-10T00:37:33.837 回答