Node.js 节点soap客户端和回调的作用域
我使用的是nodesoap客户机from(顺便说一句,是createapi),但是要将回调的结果返回到正确的范围,我有一些困难 以下是我目前掌握的代码: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
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。