1

我不确定我是否正确阅读了文档,但我认为 jquery 中的 $.when 将允许我进行多个异步调用,然后在done函数的一部分中,我可以调用另一个函数。我基本上是在渲染视图之前尝试获取所有数据。有些项目在主干对象中,有些我必须使用 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 成功回调之后被调用。有时,通常当我的服务器正在唤醒并且调用需要一段时间时,self.render() 在我完成处理 fetchLibraries 之前被调用。我在 self.render 函数和成功回调中都有一个 console.log,当它不起作用时,我基本上会在看到“数据”记录之前看到“渲染”记录。我想知道是否有办法确保 fetchLibraries 在调用渲染之前完成它的成功回调。

4

2 回答 2

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();
});
于 2013-09-19T05:56:30.203 回答
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();
 });
于 2013-09-19T06:09:53.100 回答