Javascript变量赢了';在ajax调用中t作用域到窗口
可能重复:Javascript变量赢了';在ajax调用中t作用域到窗口,javascript,jquery,sharepoint,soap,Javascript,Jquery,Sharepoint,Soap,可能重复: 因此,我调用了一个Sharepoint服务,试图返回一些值供其他地方使用,并试图声明一个窗口变量来执行此操作。看起来很简单,但是窗口变量在responseXML函数之外没有定义 userName = ""; var soapEnv = "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instan
因此,我调用了一个Sharepoint服务,试图返回一些值供其他地方使用,并试图声明一个窗口变量来执行此操作。看起来很简单,但是窗口变量在responseXML函数之外没有定义
userName = "";
var soapEnv =
"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:tns='http://schemas.microsoft.com/sharepoint/soap/'> \
<soap:Body> \
<GetUserProfileByName xmlns='http://microsoft.com/webservices/SharePointPortalServer/UserProfileService'> \
<AccountName></AccountName> \
</GetUserProfileByName> \
</soap:Body> \
</soap:Envelope>";
$.ajax({
url: "/_vti_bin/userprofileservice.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset='utf-8'"
});
function processResult(xData, status) {
$(xData.responseXML).find("PropertyData > Name:contains('FirstName')").each(function() {
window.FirstName = $(this).parent().find("Values").text();
});
$(xData.responseXML).find("PropertyData > Name:contains('LastName')").each(function() {
window.LastName = $(this).parent().find("Values").text();
});
}
userName += window.FirstName;
userName += " " + window.LastName;
console.log(userName);
userName=”“;
var soapEnv=
" \
\
\
\
\
\
";
$.ajax({
url:“/\u vti\u bin/userprofileservice.asmx”,
类型:“POST”,
数据类型:“xml”,
数据:soapEnv,
完成:processResult,
contentType:“text/xml;charset='utf-8'”
});
函数processResult(扩展数据、状态){
$(扩展数据.responseXML).find(“PropertyData>Name:contains('FirstName'))).each(函数(){
window.FirstName=$(this.parent().find(“Values”).text();
});
$(扩展数据.responseXML).find(“PropertyData>Name:contains('LastName')))。每个(函数(){
window.LastName=$(this.parent().find(“Values”).text();
});
}
用户名+=window.FirstName;
用户名+=“”+window.LastName;
console.log(用户名);
您试图在AJAX调用完成之前访问window.FirstName
和window.LastName
。您需要将其放入回调函数中:
function processResult(xData, status) {
$(xData.responseXML).find("PropertyData > Name:contains('FirstName')").each(function() {
window.FirstName = $(this).parent().find("Values").text();
});
$(xData.responseXML).find("PropertyData > Name:contains('LastName')").each(function() {
window.LastName = $(this).parent().find("Values").text();
});
userName += window.FirstName;
userName += " " + window.LastName;
console.log(userName);
}
异步调用更改执行顺序
processResult将在window.FirstName之后调用;和window.LastName;已分配给用户名,
我试图通过调用警报来描述序列,警报将显示窗口。如果在processResult body执行之前定义了FirstName,则该名称可用
window.FirstName = "First Name: Assigned before ajax call";
window.LastName = "Last Name: Assigned before ajax call";
function processResult(xData, status) {
$(xData.responseXML).find("PropertyData > Name:contains('FirstName')").each(function() {
window.FirstName = $(this).parent().find("Values").text();
});
$(xData.responseXML).find("PropertyData > Name:contains('LastName')").each(function() {
window.LastName = $(this).parent().find("Values").text();
});
userName += window.FirstName;
userName += " " + window.LastName;
alert("After ajax response UserName: " + userName);
}
userName += window.FirstName;
userName += " " + window.LastName;
alert("Before ajax response UserName: " + userName);
欢迎来到异步的精彩世界!您不能这样做。您正在进行异步调用,并在定义window.FirstName和window.LastName之前将其分配给变量。哦,请将这些调用重构为
$(xData.responseXML)。find(“PropertyData>Name…”)
谢谢,这就解释了为什么将其定义为窗口变量不起作用。我的问题是:如何使用户名在其他地方(即其他函数)可访问?您可以从processResult调用函数并传递用户名,然后在那里进行处理,明白吗?