2017-04-01 89 views
0

儘管這個問題已經得到解答,而且我經歷了其中一些問題,但我仍然無法找到我做錯了什麼。如何返回ajax導致成功?

基本上我有回到阿賈克斯的成功結果的功能:調用函數

var Functioncalling = function(id){ 
var Infotoreturn=null; 
formdata = { 
    'id': id 
}; 

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:20012/pr/servlet', 
    data: formdata, 
    contentType: "text/html", 
    success: function(result){ 
     console.log("1="+result); 
     Infotoreturn = result; 
    } 
}); 
console.log("2="+Infotoreturn); 
return Infotoreturn; 
} 

var idreturned = Functioncalling(idvalue); 
console.log("3="+idreturned); 

現在在我的第一個控制檯輸出我得到確切的數據,因爲我我想應該。但是第二個和第三個輸出都是空的。

+0

您不能返回異步請求的結果。異步請求發生在其餘代碼的(同步)流程之外,因此,當您嘗試返回結果時,請求尚未解決。您需要了解承諾或jQuery中的延期對象。 – Utkanos

+0

添加到@Utkanos所說的內容中,最後的返回語句爲時過早。變量'Infotoreturn'將爲空,因爲Ajax調用是異步執行的,即並行執行。主要功能將在其操作完成之前返回。控制檯會記錄結果,但對於變量來說已經太晚了。 – Manngo

+0

@Manngo你的意思是提前爲變量,對不對? – jaksdfjl

回答

0

添加到@Utkanos所說的內容中,最後的返回語句爲時過早。

變量Infotoreturn將爲空,因爲Ajax調用是異步執行的,即並行執行。主要功能將在其操作完成之前返回。控制檯會記錄結果,但對於變量來說已經太晚了。

實際上,Ajax調用在後臺被延遲,所以return語句仍然具有原始值。

您可以使用更高級的功能,例如Promises &延遲對象,或者您可以將下一步編寫爲回調。

下面是使用一個回調的例子:

var Functioncalling = function(id,callback) { 
    var Infotoreturn=null; 
    formdata = { 
     'id': id 
    }; 

    $.ajax({ 
     // existing code 
     success: function(result){ 
      console.log("1="+result); 
      // Modification 
      callback(result); 
     } 
    }); 
    // nothing to report yet 
} 
function where_I_need_the_result(result) { 
    console.log('I got: '+result); 
} 

Functioncalling(id,where_I_need_the_result); 
+0

對不起,我遲到的回覆。無論如何,所以我在'step2()'中添加了'return result',並且我做了這個:'function where_I_need_the_result(){var details = Functioncalling(id,step2); \t console.log(details);}'並且細節未定義,爲什麼? – jaksdfjl

+0

除非讓它等待結果,否則你永遠不會得到'Functioncalling'的結果。也就是說,要同步調用Ajax。由於很好的原因,這在主線程上已被棄用。在上面的例子中,我已經將'step2'改爲'where_I_need_the_result'來說明如何使用它。 – Manngo

+0

@jaksdfjl:仔細閱讀答案。你錯過了一個非常重要的點**傳遞你想要處理結果的代碼而不是返回結果**。你不能做'details = Functioncalling(id)',你必須**做'Functioncalling(id,function(details){/ * details is available in this scope * /})' – slebetman