如何从ajax成功调用得到响应

问题描述:

我想从我称之为函数的变量'response'中获得ajax成功调用的响应。如何从ajax成功调用得到响应

的函数调用:

var response = ExecuteAction(Id,Entityname,Processname); 

功能:

function ExecuteAction(entityId, entityName, requestName) { 
       $.ajax({ 
       type: "POST", 
       contentType: "text/xml; charset=utf-8", 
       datatype: "xml", 
       url: serverUrl + "/XRMServices/2011/Organization.svc/web", 
       data: requestXML, 
       async:false, 
       beforeSend: function (XMLHttpRequest) { 
        XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*"); 
        XMLHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); 
       }, 
       success: function (data, textStatus, XmlHttpRequest) { 
        debugger; 
        if (XmlHttpRequest.status === 200) { 
         var response = $(XmlHttpRequest.responseText).find('b\\:value').text(); 
         return response; 
        } 
       }, 
       error: function (XMLHttpRequest, textStatus, errorThrown) { 
        alert(errorThrown); 
       } 
      }); 
} 

请建议我回答。

+0

使用全局变量,而不是返回statment –

这不是JS异步函数是如何使用的。你应该使用回调函数,除非你使用的是es6,你应该使用promise。但是,如果由于某种原因你绝对需要这样做,你可以做这样的事情(注意,我没有测试这个)。

function ExecuteAction(entityId, entityName, requestName) { 
    var response; 
    $.ajax({ 
     type: "POST", 
     contentType: "text/xml; charset=utf-8", 
     datatype: "xml", 
     url: serverUrl + "/XRMServices/2011/Organization.svc/web", 
     data: requestXML, 
     async: false, 
     beforeSend: function(XMLHttpRequest) { 
      XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*"); 
      XMLHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); 
     }, 
     success: function(data, textStatus, XmlHttpRequest) { 
      debugger; 
      if (XmlHttpRequest.status === 200) { 
       response = $(XmlHttpRequest.responseText).find('b\\:value').text(); 
      } 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      alert(errorThrown); 
     } 
    }); 
    while (!response); 
    return response; 
} 

下面介绍如何使用回调与功能

function ExecuteAction(entityId, entityName, requestName, callback) { 
    var response; 
    $.ajax({ 
     type: "POST", 
     contentType: "text/xml; charset=utf-8", 
     datatype: "xml", 
     url: serverUrl + "/XRMServices/2011/Organization.svc/web", 
     data: requestXML, 
     async: false, 
     beforeSend: function(XMLHttpRequest) { 
      XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*"); 
      XMLHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); 
     }, 
     success: function(data, textStatus, XmlHttpRequest) { 
      debugger; 
      if (XmlHttpRequest.status === 200) { 
       response = $(XmlHttpRequest.responseText).find('b\\:value').text(); 
       callback(null, response); 
      } 
     }, 
     error: function(XMLHttpRequest, textStatus, error) { 
      alert(error); 
      callback(error); 
     } 
    }); 
} 

称为这样

var response = ExecuteAction(Id,Entityname,Processname, function(err, result) { 
    if (err) console.log('whoops, error', err); 
    console.log('I will print upon completion', result); 
}); 

你的问题是,您使用的是同步功能,当AJAX是异步,

你可以使用一个承诺 -

return new Promise((resolve, reject) => { 
    $.ajax({ 
    type: "POST", 
    contentType: "text/xml; charset=utf-8", 
    datatype: "xml", 
    url: serverUrl + "/XRMServices/2011/Organization.svc/web", 
    data: requestXML, 
    beforeSend: function (XMLHttpRequest) { 
     XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*"); 
    XMLHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); 
    }, 
    success: function (data, textStatus, XmlHttpRequest) { 
     if (XmlHttpRequest.status === 200) { 
      var response = $(XmlHttpRequest.responseText).find('b\\:value').text(); 
      resolve(response); 
     } 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
      reject(errorThrown); 
    } 
}); 

,然后用它像

var responsePromise = ExecuteAction(Id,Entityname,Processname); 

responsePromise.then((response) => { 
    console.log(response) 
}, 
(error) => { 
    console.log(error) 
});