我正在使用 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
也是异步调用的,因此它也不能返回值,因此您必须对其应用相同的技术。
异步模块可以使这种事情变得更容易:特别是,当你有一堆必须按顺序运行的函数时,它的"瀑布"模式很有用,每个函数都从前一个函数中回调。