jquery在我完成成功处理程序之前发生火灾

时间:2013-09-19 05:45:08

标签: jquery backbone.js

我不确定我是否正确阅读文档,但我认为$ .when jquery允许我做多个异步调用然后在函数的done部分,我' d能够调用另一个函数。我基本上是在渲染视图之前尝试获取所有数据。有些项目在骨干对象中,有些项目我必须使用ajax调用手动调用,因为没有与信息对应的骨干对象。

var fetchLibraries = function () {
      if (this.screen == "EDIT") {
                    $.ajax({
                        url: 'libraries',
                        type: "GET",
                        crossDomain: $.support.cors,
                        xhrFields: {
                            withCredentials: $.support.cors
                        },
                        success: function (data) {
                            console.log(data);
                            // do some processing with the data that can take some time
                        }
                    });
                }
               }
            };

            $.when(this.platforms.fetch(),
                fetchLibraries()).done(function () {
                self.trigger('removeOverlay');
                self.render();
            });

通常情况下,这可以正常工作,并且在fetchLibraries成功回调之后调用我的渲染函数。有时,通常当我的服务器唤醒并且调用需要一段时间时,在完成fetchLibraries的处理之前会调用self.render()。我在self.render函数和成功回调中都有一个console.log,当它不起作用时,我基本上在看到“数据”记录之前看到了“render”。我想知道是否有办法确保fetchLibraries在调用render之前完成它的成功回调。

2 个答案:

答案 0 :(得分:1)

传递给when的方法应该返回一个承诺。

var fetchLibraries = function () {
  if (this.screen == "EDIT") {
    return $.ajax({ //return the promise
        url: 'libraries',
        type: "GET",
        crossDomain: $.support.cors,
        xhrFields: {
            withCredentials: $.support.cors
        },
        success: function (data) {
            console.log(data);
            // do some processing with the data that can take some time
        }
    });
  }
};

$.when(this.platforms.fetch(), fetchLibraries()).done(function () {
    self.trigger('removeOverlay');
    self.render();
});

答案 1 :(得分:0)

如果你这样写会怎么样:

var fetchLibraries = function () {
   if (this.screen == "EDIT") {
       $.ajax({
         url: 'libraries',
         type: "GET",
         crossDomain: $.support.cors,
         xhrFields: {
            withCredentials: $.support.cors
         }
      });
   }
  };

 $.when(this.platforms.fetch(), fetchLibraries()).done(function (data) {
      // write success's body here 
      self.trigger('removeOverlay');
      self.render();
 });