2015-07-21 195 views
0

由於$.ajax GET(我認爲)的性質,我不確定我在尋找什麼可能在這種方法中,但認爲我應該問,因爲它導致我一些麻煩。我絕不是JS的專家,如果這是顯而易見的,道歉很糟糕,想不到用不同的方式說出來。

我在做什麼 - 使用$.ajax從後端API函數(這些工作)獲取值。在success屬性中,我使用匿名函數傳遞更多的數據,否則不會返回。當瀏覽Chrome控制檯中的控制檯斷點時,成功函數通常會被忽略,因爲它不夠快。

我想 - 在下面的例子中,我不想getStuff完成,又回到DoSomething其成功之前,因爲我錯過從API數據的負載,我需要通過傳遞給DoSomething - 這可能實現嗎?

function getStuff(id, hid) { 
    $.ajax({ 
     type: "GET", 
     url: "/api/GetMyStuff/" + id, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (vData) { 
      DoSomething(vData, id, hid); // not always being hit 
     } 
    }); 
} 
+0

看看https://api.jquery.com/jquery.when/ –

回答

2

您可以使用async選項並將其設置爲false得到同步調用:

function getStuff(id, hid) { 
    $.ajax({ 
     type: "GET", 
     url: "/api/GetMyStuff/" + id, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, // HERE 
     success: function (vData) { 
      DoSomething(vData, id, hid); // not always being hit 
     } 
    }); 
} 

不是做Ajax請求的好方法,你應該重新考慮你的代碼組織(如爲您的getStuff方法提供回調函數,並在success回調中調用它)。

+1

不要從ajax中取出'a'。 ;-) –

+0

這通常不可取。這會阻止主要事件循環,這會在請求本身未決時導致用戶出現laggy行爲。 – jmar777

+0

@ jmar777這就是我在我的(更新的)答案的末尾所說的。 – Holt

1

你正在嘗試做的是不可能的。異步性是「泄漏」的,這意味着任何需要回調的異步操作(例如,$.ajax())都必然會強制執行調用鏈上的異步控制流。

請注意,在不久的將來(感謝ES7中的async/await),這種情況會好一些。異步性仍然存在漏洞,但新的關鍵字使得重構場景比任何地方的手動阻塞回調都容易一些。

+0

該死的,我當時想的,謝謝,我在那裏調用函數DoSomething,是來自匿名方法的數據丟失或將在晚些時候通過?試圖習慣Chrome控制檯以及它可以/不可以做什麼。 – PurpleSmurph

+0

如果在當前代碼中不總是調用DoSomething(),那可能意味着有錯誤。我建議在你的'$ .ajax()'配置中添加一個'error:function(){}'處理程序。 – jmar777

+0

似乎沒有 - 通過Id引入,並解析爲'getStuff'函數,如果我直接通過它調用API調用。將會有更多的錯誤處理代碼,但這似乎不是問題。失敗的Ids是隨機的,它們從不相同,這就是爲什麼我相信ajax調用在函數有時間返回之前完成的原因。 – PurpleSmurph