2011-09-25 87 views
0

我知道我可以將調用設置爲同步,或者在complete()回調中包裝所有內容,但它看起來不夠優雅。這裏就是我的了:在方法返回之前等待ajax完成

_loadShader: (url) -> 
    (@_loadResource url, false).complete (e) -> 
     vert = e.responseText.split '[Vertex shader]' 
     frag = vert[1].split '[Fragment shader]' 

     vertex: frag[0] 
     fragment: frag[1] 

_loadResource: (url, async) -> 
    url = 'Public/' + url 

    $.ajax 
     url: url 
     dataType: 'text' 
     async: async or true 
     complete: 
      @ 

_loadShader()返回XHR對象,但我真正想要的是,它不返回,直到完成()被炒魷魚 - 即使這意味着鎖定瀏覽器。我對結果的處理很重要,我不想開始用回調包裝我的代碼。

編輯:重新吉格舞到這一點,不正是我後:

_loadShader: (url, e) ->  
    result = @_loadResource url, false 
    vert = result.split '[Vertex shader]' 
    frag = vert[1].split '[Fragment shader]' 

    shader = 
     vertex: frag[0] 
     fragment: frag[1] 

_loadResource: (url, async = true) -> 
    url = 'Public/' + url 
    xhr = $.ajax 
     url: url 
     dataType: 'text' 
     async: async 
    return xhr.responseText 
+1

所以,你要同步Ajax調用,但不希望設置'async'假? –

+0

不,我很好,把它設置爲false,但我不能阻止_loadShader()返回 - 我應該堅持它在一個while循環或什麼? –

+2

「異步或真實」不會總是評估爲「真」嗎? –

回答

1

會發生什麼事是

  1. 你叫$.ajaxasync: false
  2. 服務器響應和jQuery運行您傳遞的任何回調$.ajax
  3. 函數返回_loadResource。然後,您將一個complete回調附加到它返回的XHR對象。但是因爲所有XHR回調已經運行,所以這沒有任何影響。

你應該,而是通過在complete回調作爲參數傳遞給_loadResource,並將它提供回調$.ajax。因此,呼叫變成

@_loadResource url, false, (e) -> ... 

和函數的定義變得

_loadResource: (url, async = true, complete = (->)) -> 
    $.ajax {url, dataType: 'text', async, complete} 
+0

我該如何爲呼叫者做類似的事情?即。 @_loadShader應該返回,直到收到結果。我希望在這些函數中包裝/隱藏回調函數,以便函數本身只在返回結果時才返回。 –

0

我從來沒有發現更好的解決方案,除了設置私有變量函數,然後jQuery的回調變量設置爲數據。

代碼應該是這樣的:

_loadResource: (url) -> 
    resource = null #will cause resource to be private variable of _loadResource, not of callback. 
    $.ajax 
     url: url 
     async: false 
     success: (data) -> 
      resource = data #setting resource to what jquery got from server. 
    resource #returning resource. 

它編譯成:

_loadResource: function(url) { 
    var resource; 
    resource = null; 
    $.ajax({ 
    url: url, 
    async: false, 
    success: function(data) { 
     return resource = data; 
    } 
    }); 
    return resource; 
} 
相關問題