0

私は何を達成しようとしていますか?

Clayton Lengel-Zigich によって作成された素敵な jenkins ラジエーター アプリケーションを更新しようとしています。これは、jsonp API を使用してジェンキンス マスター サーバーのステータスを取得し、ジョブ ステータスを表示する backbone.js アプリケーションです。このアプリケーションを変更して、複数のマスターから取得し、多くのジョブのステータスを表示したいと考えています。

私は何を試しましたか?

同期機能を更新して、2 つの 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;

  },

私が得たもの

Web ページでマージされた結果を確認できると思っていましたが、1 つのサーバーの結果しか表示されません。どのサーバーが表示されるかはランダムであり、私のマージがマージではなく上書きであることを示しています。

私はjavascriptをなめることさえ知らないので、次にどこを見るべきかさえわからない段階にいます。おそらく、_.extend セクションが実際にモデルを更新するものでしょうか? もしそうなら、別の方法で私が望むものを達成する方法はありますか?

4

2 に答える 2

0

どのリクエストが最初に終了するかについての保証はありません。B が A の前に終了するとjsonB、空にマージされjoinedJson(単純に に設定jsonB)、A が終了すると で上書きさjoinedJsonjsonAます。

それだけが問題ではありません。あなたが戻った時点で、どちらかのリクエストが完了joinedJsonしたという保証はありません。非同期リクエストを同期であるかのように扱っています。

于 2013-06-05T13:16:02.887 に答える