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调用函数并传递用户名,然后在那里进行处理,明白吗?