Javascript多个setIntervals

时间:2015-06-18 05:50:48

标签: javascript jquery ajax

我有一个场景,我有一个基于setInterval的代码检查ajax调用返回值。像这样:

var processInterval = setInterval(function () {

    var processResult = getVideoStatus(data.file_name);

    console.log(processResult);

    if (processResult === "ready") {

        clearInterval(processInterval);
        //Logic

    }

}, 1000);

对于getVideoStatus函数,这里是:

var getVideoStatus = function () {

    var result = null;
    jQuery.ajax({
        url: 'someurl',
        type: 'GET',
        dataType: 'html',
        success: function (response) {

            result = response;

        }
    });

    var statusTimeout = setInterval(function () {

        if (result != null) {

            clearInterval(statusTimeout);
            alert(result);
            return result;

        }

    }, 100);


}

我在getVideoStatus函数中尝试做的是仅在ajax调用完成且result不为空时才返回值。我看到它确实返回/提醒正确的值但是当我尝试console.log(processResult)时,它根本不记录任何内容。

我认为它与第一个间隔有关,因为getVideoStatus似乎返回值正常。有任何逻辑问题吗?

2 个答案:

答案 0 :(得分:2)

你所选择的方法并不理想。只需使用适当的Promise / thenable API,可在数据可用时提供回调。在你的情况下:

var getVideoStatus = function () {
    return jQuery.ajax({
        url: 'someurl',
        type: 'GET',
        dataType: 'html'
    });
}

getVideoStatus().then(function(result) {
    console.log(result);
});

好处:更清晰,更可预测的代码行为。

答案 1 :(得分:1)

您的问题是var processResult = getVideoStatus(data.file_name);没有返回任何内容。所以这段代码:

var getVideoStatus = function(){ return jQuery.ajax({ url : 'someurl', type: 'GET', dataType: 'html', success : function (response) { result = response; } }); } var deferred = getVideoStatus(data.file_name); deferred.then( function success(data) { // do something here, call came back w/ data }, function error() { // handle error } );

没有按预期工作。有一种更好的方法来做你想要的。它是这样使用jQuery Deferreds:

setInterval

你没有得到的是AJAX请求是异步的。代码将不会继续一步一步地运行 - 相反,浏览器将运行请求然后返回并且您可以继续运行但它不会返回到您启动请求的相同位置。

你可以得到类似的东西,但是没有人使用jQuery会这样做而且很复杂 - 你需要使用app.run(function ($rootScope,$location,AUTH_EVENTS,$cookieStore,$http,$q,$timeout) { $rootScope.flag = false; $rootScope.$on('$routeChangeStart', function(evt, absNewUrl, absOldUrl) { $cookieStore.get(AUTH_EVENTS); if($rootScope.AUTH_EVENTS != AUTH_EVENTS.loginSuccess && !$cookieStore.get(AUTH_EVENTS)){ //console.log($rootScope.AUTH_EVENTS); $location.path('/'); //$route.reload(); } if(absNewUrl.$$route.originalPath == '/dashboard' && $rootScope.flag == false){ $rootScope.flag = true; } //here you can check for your own condition and if not logged in then set $location.path(loginpath); }); }); 并检查XHR请求的就绪状态。 jQuery为你做了这一切。所以从这开始,然后阅读如果你想实现自己的工作原理。