如何在Promise中编写“再试一次”?

时间:2017-02-16 10:21:10

标签: javascript json meteor

我会尽力描述我的问题。我有一个方法(1)通过API获取所有Grafana数据源(2)创建2 JSON(3)将它们发布到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);
                }
            });

    }));
});

我知道剪切的代码不起作用,但我更容易使其可读。

所以有人可以帮助我做一个像“如果错误尝试重新创建”的事情?我看过Meteor重试,但它认为这不是我需要的

1 个答案:

答案 0 :(得分: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