2011-09-25 60 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; 
} 
相关问题