2015-11-14 73 views
1

有功能,當async爲false時它正在工作,但我想要相同的功能(我的意思是返回值),但是異步是真實的。當async爲真時,Ajax調用返回undefined

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;裏面的成功函數,否則,返回ret.d將立即返回,無論你ajax是否成功,這就是爲什麼當你強制ajax運行同步它的作品,但不是當async,因爲時間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時它沒有返回任何值。 –