【发布时间】:2014-05-08 22:15:51
【问题描述】:
我正在编写一个小应用程序,它将使用 jQuery ajax 调用对第三方 API 进行 SOAP 调用。我想将以下函数设为“通用”,但在“done()”ajax 方法的最内层函数中遇到了变量范围问题。该函数是返回好东西的地方。我希望将键、值对放在传递给 APICall 函数的“结果”对象中,但我不知道如何在下面引用它。
我认为我不能修改“完成”部分中的函数参数列表,可以吗?我刚刚尝试将传入的“结果”添加到“完成”函数中,没有语法问题,但它不起作用。
想法?
function APICall(method, username, password, payload, result) {
var wsUrl = "https://localhost.my.company.org/API/Service.asmx";
var soapRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<soap:Envelope \n"
+ " soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" \n"
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" \n"
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" \n"
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"> \n"
+ " <soap:Body> \n"
+ " <__METHOD__ xmlns=\"http://THIRD-PARTY.API.Web.Service/\"> \n"
+ " <UserName>__USERNAME__</UserName> \n"
+ " <Password>__PASSWORD__</Password> \n"
+ " __PAYLOAD__ \n" + " </__METHOD__> \n"
+ " </soap:Body> \n" + "</soap:Envelope>\n";
soapRequest = soapRequest.replace(/__METHOD__/g, method);
soapRequest = soapRequest.replace(/__USERNAME__/g, username);
soapRequest = soapRequest.replace(/__PASSWORD__/g, password);
soapRequest = soapRequest.replace(/__PAYLOAD__/g, payload);
$.ajax({
type : "POST",
headers : {
SOAPAction : '"http://THIRD-PARTY.API.Web.Service/' + method + '"'
},
url : wsUrl,
contentType : "text/xml",
dataType : "xml",
data : soapRequest,
error : processAJAXError
}).done(
function(data, textStatus, jqXHR) {
$($.parseXML($(data).find(method + 'Result').text())).find(
'Data').each(
function(key, val) {
result[$(val).find('Room').text()] = $(val).find(
'ID').text();
console.log($(val).find('Room').text() + ' => '
+ $(val).find('ID').text());
});
});
}
【问题讨论】:
-
由于 AJAX 是异步的,将 KV 对放在调用者的
result变量中没有用——该函数已经返回。 -
您应该能够从 done 函数中访问
result变量,但正如 Barmar 所说,这可能对您没有帮助。 -
尝试用结果绑定匿名函数 .done(function(...){}.bind(result));我不知道你是否也可以绑定 $.ajax。
-
啊!,我明白你对异步行为的意思了。我的其他代码(Per)正在发出静态请求。我看到 jQuery ajax 有一个
async=false设置。在这种情况下,这可能是最好的。谢谢
标签: javascript jquery scope