2016-09-06 2 views
0

Я хочу получить ответ на вызов ajax success в переменной 'response', откуда я вызвал функцию.Как получить ответ от вызова ajax success

Вызов функции:

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

использование глобальной переменной вместо возврата даного –

ответ

2

Это это не то, как предполагается использовать асинхронные функции JS. Вы должны использовать обратные вызовы, если только вы не используете es6, в котором вы должны использовать обещания. Но если вам почему-то нужно было заставить его работать, вы могли бы сделать что-то подобное (заметьте, я не проверял это).

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); 
}); 
1

Ваша проблема заключается в том, что вы используете для синхронизации функции, когда AJAX является асинхронной,

вы можете использовать Promise -

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) 
}); 
Смежные вопросы