2015-11-14 3 views
1

есть функция, и она работает, когда async является ложным, но я хочу ту же функциональность (под которой я имею в виду возвращаемое значение), но с async - true.Ajax Call возвращает undefined, когда async is true

function Call(param, proc) { 
    var url = "../../DataManager/DataManagment.aspx/DataSelector"; 
    var ret; 
    $.ajax({ 
     url: url, 
     type: "POST", 
     datatype: "json", 
     data: JSON.stringify({ 
      "data": param, 
      "action": proc 
     }), 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      ret = data; 
     }, 
     async: false, 
     error: errorFn 
    }); 
    return ret.d; 
} 

ответ

0

Вы can't return от асинхронного кода, как AJAX. Вместо этого вам нужно пересмотреть свою функцию как маленькую.

Так что вам необходимо либо использовать функцию обратного вызова и вызвать его в функцию успеха или лучше просто вернуть обещание объект:

function Call(param, proc) { 
    var url = "../../DataManager/DataManagment.aspx/DataSelector"; 
    return $.ajax({ 
     url: url, 
     type: "POST", 
     datatype: "json", 
     data: JSON.stringify({ 
      data: param, 
      action: proc 
     }), 
     contentType: "application/json; charset=utf-8", 
     error: errorFn 
    }); 
} 

Call(params, process).then(function(data) { 
    console.log(data); 
}); 
+0

Спасибо, что так много брата, его работа для меня. –

1

ли что-то вроде:

function callServerAsync(){ 
    $.ajax({ 
     url: '...', 
     success: function(response) { 

      successCallback(response); 

     } 
    }); 
    } 

    function successCallback(responseObj){ 
    alert(JSON.stringify(responseObj)); // Only applicable to JSON response 
    } 
0

Для асинхронном = истина; return не будет служить вашей цели. Вместо того, чтобы пойти на некоторые функции обратного вызова, как показано ниже:

function Call(param, proc, callBackFunc) { 
    var url = "../../DataManager/DataManagment.aspx/DataSelector"; 
    var ret; 
    $.ajax({ 
     url: url, 
     type: "POST", 
     datatype: "json", 
     data: JSON.stringify({ 
      "data": param, 
      "action": proc 
     }), 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      ret = data; 

      if(typeof callBackFunc == 'function') 
      { 
       callBackFunc(ret.d); 
      } 
     }, 
     async: true, 
     error: errorFn 
    }); 

} 

И называют вашу функцию:

function myCallBackFunc(obj) 
{ 
    alert(obj); 
} 

//call the actual function like: 
Call(param, proc,myCallBackFunc); 
0

партнера, вы проблема заключается в: возвращение ret.d;

вы должны вернуть вам ret.d; внутри функции успеха, в противном случае return ret.d будет немедленно возвращаться независимо от того, насколько вы ajax были успешными или нет, поэтому, когда вы принудительно выполняете синхронизацию ajax, она работает, но не тогда, когда асинхронно, потому что это время ret определено только, но не назначено значение , проверить это:

function Call(param, proc) { 
var url = "../../DataManager/DataManagment.aspx/DataSelector"; 
var ret; 
$.ajax({ 
url: url, 
type: "POST", 
datatype: "json", 
data: JSON.stringify({ 
    "data": param, 
    "action": proc 
}), 
contentType: "application/json; charset=utf-8", 
success: function (data) { 
    ret = data; 
    return ret.d; 
}, 
async: true, 
error: errorFn 
}); 

} 
+0

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

+0

брата его не возвращает никакого значения, когда я возвращаю ret.d в функцию успеха. –

Смежные вопросы