如何在自定义异步函数中使用jQuery promise?

时间:2014-06-26 18:18:40

标签: javascript jquery backbone.js

所以,我已经构建了一个api对象,可以通过require.js包含在任何JavaScript文件中。在api对象中,我打电话来创建如下所示的Backbone模型/集合:

getDatapoints: function(attributes, callback) {
    require(['models/datapoint'], function(Datapoint){
        var datapoint = new Datapoint.DatapointCollection(attributes);
        datapoint.fetch({success: function(data){
            return callback(data.toJSON());
        }});
    });
}

我希望有一种能够启动多个调用并在所有调用完成后运行回调函数的方法。它看起来像jQuery的$ .when函数做了我想要的,但我不知道除了$ .ajax调用之外的其他任何东西都可以使用它。

我在正确的地方寻找吗?我应该看看像q.js这样的东西吗?

2 个答案:

答案 0 :(得分:1)

扩展@ mattacular的答案:

API = {
  getDatapoints: function (attributes){ 
    var dfd = $.Deferred();
    require(['models/datapoint'], function(Datapoint){
      var dataPoints = new Datapoint.DatapointCollection(attributes);
      dataPoints.fetch().then(function (points){
        dfd.resolve(points.toJSON());
      }, function (error){
        dfd.reject(error);
      });
    });
    return dfd.promise();
  },
  getAllDatapoints: function (arrayOfAttributes){
    var arrayOfPromises = arrayOfAttributes.map(this.getDatapoints);
    return $.when.apply($, arrayOfPromises);
  }
}

您实际调用getAllDatapoints方法的位置:

var allDatapointAttributes = [{...}, {...}, {...}];
API.getAllDatapoints(allDatapointAttributes).done(function(){
  console.log.apply(console, arguments);
  // should output an array of arrays containing dataPoint
  // objects when all the requests have completed successfully.
});

答案 1 :(得分:0)

您可以使用jQuery的Deferred对象执行此操作。这是一个简单的例子:

getDatapoints: function (attributes, callback() { 
   var dataPoints = $.Deferred();

   // perform async calls here
   // when "done," call dataPoints.resolve() or dataPoints.reject() accordingly

   return dataPoints.promise();
}

编辑:删除过时的教程