0

我想达到什么目的?

我正在尝试更新由 Clayton Lengel-Zigich 制作的一个不错的 jenkins 散热器应用程序。它是一个backbone.js 应用程序,它使用它的jsonp api 获取jenkins 主服务器的状态并显示作业状态。我想更改此应用程序以从多个主服务器获取并显示许多作业的状态。

我尝试了什么?

我试图更新同步函数来执行两个 jsonp 请求,然后合并结果。原始文件可以在这里找到:https ://github.com/clayton/jenkins-radiator/blob/master/src/radiator.js

sync: function(method, model, options) {

      var paramsA = _.extend({
          type: 'GET',
          dataType: 'jsonp',
          processData: true,
          url: "http://serverA:8080/api/json?jsonp=?"
      }, options);
      var a = $.ajax(paramsA);


      var paramsB = _.extend({
          type: 'GET',
          dataType: 'jsonp',
          processData: true,
          url: "http://serverB:8080/api/json?jsonp=?"
      }, options);
      var b = $.ajax(paramsB);

      function MergeJobs(o, ob) {
        for (var z in ob.jobs) {
           o.jobs.push(ob.jobs[z]);
        }
        return o;
      }

      var joinedJson = []
      a.done(function(jsonA) {
        joinedJson = jsonA;
      });
      b.done(function(jsonB) {
        MergeJobs(joinedJson, jsonB);
        //joinedJson = jsonB;
      })
      return joinedJson;

  },

我得到了什么

我希望我能够在网页中看到合并的结果,但是我只看到其中一台服务器的结果。显示哪个服务器是随机的,向我表明我的合并是覆盖,而不是合并。

我一点也不知道 javascript,所以我处于我什至不知道下一步该往哪里看的阶段。也许 _.extend 部分实际上更新了模型?如果是这样,有没有办法实现我想要的另一种方式?

4

2 回答 2

0

无法保证您的哪个请求首先完成。如果 B 在 A 之前完成,它将合并jsonB到空中joinedJson(只需将其设置为jsonB),然后当 A 完成时,它将用joinedJson覆盖jsonA

这不是你唯一的问题。在您返回时joinedJson,不能保证任何一个请求都已完成;您将异步请求视为同步请求。

于 2013-06-05T13:16:02.887 回答
0

您可以创建单独的模型并在同一模型上显示它们如果模型具有相同的结构,我建议您创建一个包含所有模型的数组,然后将它们传递给一个集合。如果您的模型完全不同,则将它们传递给视图并在视图中有一些逻辑来处理您的所有模型。

这个网站 ( http://backbonetutorials.com/ ) 有一些很棒的教程可以帮助您开始使用模型和集合,以防万一您没有那么多使用骨干网。

于 2013-06-05T09:36:25.100 回答