2017-02-16 3 views
0

私はできる限り最善のものとして自分の問題を説明しようとします。私は、(1)APIを介してすべてのGrafanaデータソースを取得し、(2)2つのJSONを作成してGrafana APIに投稿する方法があります。プロミスで「やり直す」コードを作成するには?

コードが3番目のステップを行うときに私のJSONが終了しないことがあるので、エラーが発生し、結果が私の望むものではありません。

updateDashboard = Meteor.bindEnvironment(function() { 
 
    console.log("called updateDashboard()"); 
 
    new Promise(Meteor.bindEnvironment(function(resolve) { 
 
     // get all the datasources of Grafana 
 
     HTTP.call("GET", 'http://localhost:3000/api/datasources', { 
 
       headers: { 
 
        'Accept': 'application/json', 
 
        'Content-Type': 'application/json', 
 
        'Authorization': APIKEY, 
 
       }, 
 
      }, 
 
      function(error, result) { 
 
       if (!error) { 
 
        allDataSources = result.data; 
 
        resolve(allDataSources); 
 
       } else { 
 
        console.error(error); 
 
       } 
 
      }); 
 

 
    })).then(function(allDataSources) { 
 
     // create the dashboard 
 
     return new Promise(function(resolve) { 
 
     //ANCHOR 
 
      var dataJSON = { 
 
       //create the dashboard 
 
       "annotations": { 
 
        "list": [] 
 
       }, 
 
       "description": "Containers metrics", 
 
       "editable": true, 
 
       "gnetId": null, 
 
       "graphTooltip": 1, 
 
       "hideControls": false, 
 
       "id": null, 
 
       "links": [], 
 
       "refresh": "1s", 
 
       //create the lines 
 
       "rows": _.map(allDataSources, function(ds, index) { 
 
        return newGraphOverview(ds, index); 
 
       }), 
 
       //dashboard things 
 
       "schemaVersion": 14, 
 
       "style": "dark", 
 
       "tags": [ 
 
        "docker" 
 
       ], 
 
       "time": { 
 
        "from": "now-15m", 
 
        "to": "now" 
 
       }, 
 
       "timepicker": { 
 
        "refresh_intervals": [ 
 
         "1s", 
 
         "5s", 
 
         "10s", 
 
         "30s", 
 
         "1m", 
 
         "5m", 
 
         "15m", 
 
         "30m", 
 
         "1h", 
 
         "2h", 
 
         "1d" 
 
        ], 
 
        "time_options": [ 
 
         "5m", 
 
         "15m", 
 
         "1h", 
 
         "6h", 
 
         "12h", 
 
         "24h", 
 
         "2d", 
 
         "7d", 
 
         "30d" 
 
        ] 
 
       }, 
 
       "timezone": "browser", 
 
       "title": "Docker Containers _custom_from_js", 
 
       "version": 1 
 
      } 
 

 
      dataJSONDetails = newGraphDetails(allDataSources); 
 

 
      resolve(dataJSON); 
 

 
     }); 
 

 
    }).then(Meteor.bindEnvironment(function(dataJSON) { 
 
     // send the dashboard 
 
     HTTP.call("POST", "http://localhost:3000/api/dashboards/db", { 
 
       headers: { 
 
        'Accept': 'application/json', 
 
        'Content-Type': 'application/json', 
 
        'Authorization': APIKEY, 
 
       }, 
 
       data: { 
 
        dashboard: dataJSON, 
 
        overwrite: true 
 
       } 
 
      }, 
 
      function(error, result) { 
 
       if (!error) { 
 
        console.log("result post " + dataJSON.title + " ----------------------------------") 
 
        console.log(result); 
 
       } else { 
 
        //HERE I WANT TO DO IF ERROR GO TO ANCHOR 
 
        console.log("error post " + dataJSON.title + " ----------------------------------") 
 
        console.error(error); 
 
       } 
 
      }); 
 

 
     //send the dashboard for details view 
 
     HTTP.call("POST", "http://localhost:3000/api/dashboards/db", { 
 
       headers: { 
 
        'Accept': 'application/json', 
 
        'Content-Type': 'application/json', 
 
        'Authorization': APIKEY, 
 
       }, 
 
       data: { 
 
        dashboard: dataJSONDetails, 
 
        overwrite: true 
 
       } 
 
      }, 
 
      function(error, result) { 
 
       if (!error) { 
 
        console.log("result post " + dataJSONDetails.title + " ----------------------------------") 
 
        console.log(result); 
 
       } else { 
 
       //HERE I WANT TO DO IF ERROR GO TO ANCHOR 
 
        console.log("error post " + dataJSONDetails.title + " ----------------------------------") 
 
        console.error(error); 
 
       } 
 
      }); 
 

 
    })); 
 
});

私は動作しません切り取らコードを知っているが、私がそれを読みやすくするために簡単でした。

誰かが「エラーが再作成しようとすると」のようなものを作る手助けをすることができますか?私は流星の再試行を見たが、それは私が必要としているとは思わない。

+0

または、時には問題が発生するのは私の2つの投稿ですか?私はもう一方をしなければならないでしょうか? – Jerome

答えて

1

約束やコールバックを使用しないでください。 Meteorの例で見たように、通常の同期的なコードを書いてください。

var datasources = null; 
try { 
    var request1 = HTTP.call("GET", 'http://localhost:3000/api/datasources', { 
       headers: { 
        'Accept': 'application/json', 
        'Content-Type': 'application/json', 
        'Authorization': APIKEY, 
       } 
      }); 
    // From http://docs.meteor.com/api/http.html#HTTP-call 
    datasources = request.data; 
} catch (e) { 
    console.error(e); 
    return; 
} 
// Do all the other steps you keep wanting to do... 

他のHTTP呼び出しに対しても同様のステートメントを繰り返します。 localhostに到達できない限り、通常はエラーは発生しません。この場合はすべて到達できません。だからtry-catchで気にしないでください。クライアント(メソッドの呼び出し側)が例外をスローして処理させます。

通常は、Meteor.bindEnvironmentを使用する必要はありません。

+0

助けてくれてありがとう、私は約束なしにもう一度自分の方法を試してみるつもりです。なぜ私は 'Meteor.bindEnvironment'を使用する必要があるのか​​分かりませんが、'あなたのコードはファイバーで実行する必要があります 'というエラーが常に発生します – Jerome

+0

そして、呼び出しの順序が尊重されないため、メソッドが機能しません。 .. – Jerome

+1

それは、呼び出しの順序を尊重します、それは同期です。最初の 'HTTP.call'が起こり、次に' HTTP.call'が起こります。これはMeteorが提供する機能です。そうでなければ、 "コードはファイバーで実行する必要があります"という問題は、メソッド、Meteor.startupまたはMeteor.publishの中にあるべきであるため、問題が発生しています。これは、クライアントではなくサーバーに書き込まれます。メソッドを使ってみてください。答えは正しいが、あなたがプラットフォームについて学ぶことがたくさんある! – DoctorPangloss

関連する問題