如何刷新承诺链中的数据?

时间:2017-07-28 00:34:41

标签: javascript jquery angularjs ajax promise

在下面的代码中,我想要实现的是每10秒进行一次return $http.get(newurl_3);调用并刷新最后一个响应中的数据。我在不同的地方尝试过setInterval,但无法使其工作。

它实际上是一个承诺链,分为5个步骤,总共超过100行代码。不确定是否将整个事物放在setInterval中是一种很好的做法。

$http.get(url).then(function(data) {
    // playing with data and returning a new promise
    return $http.get(newurl_1); 
}).then(function (data) {
    return $http.get(newurl_2); 
}).then(function (data) {
    return $http.get(newurl_3); 
}).then(function (data) {
    return $http.get(newurl_4); // this call only needs to be refreshed. 
}).then(function (data) {
    // creating data array for UI. 
    // needs to be refreshed every 10 second to fetch updated data. 
    $scope.UI_presentation_Array = data... 
})

2 个答案:

答案 0 :(得分:2)

首先,考虑您的承诺链可以编写,如下所示:

var promise = $http.get(url).then(function(data) {
    // playing with data and returning a new promise
    return $http.get(newurl_1); 
}).then(function (data) {
    return $http.get(newurl_2); 
});

promise.then(function (data) {
    return $http.get(newurl_3); // this call only needs to be refreshed. 
}).then(function (data) {
    // creating data array for UI. 
    // needs to be refreshed every 10 second to fetch updated data. 
    $scope.UI_presentation_Array = data... 
});

请注意,中断位于需要进行刷新的步骤之前。现在,promise是流程的静态部分,promise.then()...是您想要重复的部分。

现在将重复的部分包裹在function refresh() {...}中并从refresh致电setInterval,完整地给出:

var promise = $http.get(url).then(function(data) {
    // playing with data and returning a new promise
    return $http.get(newurl_1); 
}).then(function (data) {
    return $http.get(newurl_2); 
});

function refresh() {
    return promise.then(function (data) {
        return $http.get(newurl_3); // this call only needs to be refreshed. 
    }).then(function (data) {
        // creating data array for UI. 
        // needs to be refreshed every 10 second to fetch updated data. 
        $scope.UI_presentation_Array = data... 
    });
}

var intervalRef = setInterval(refresh, 10000);

由于相当长的10秒间隔,这可能就足够了。除非得到非常迟缓,否则你不会遭遇“重叠” - 即在前一个完成之前开始一个获取周期。

为了完全安全起见,您应该考虑不是refresh()setInterval,而是在完成上一个周期加上延迟。

答案 1 :(得分:0)

如果要求整个链条加载数据,那么您可能没有选择,每次都必须以相同的方式调用

function load() {    
    $http.get(url).then(function(data) {
        // playing with data and returning a promise
        return $http.get(newurl); 
    }).then(function (data) {
        // creating data array for UI. 
        // needs to be refreshed every 10 second to fetch updated data. 
        $scope.UI_presentation_Array = data... 
    })
}
setInterval( load, 10000);