使用setTimeout在js中使用Promise重复函数

时间:2015-01-27 10:47:17

标签: javascript jquery timer promise

我有一个包含单个API函数的小型库start()

一旦启动,它应该每2秒检查一次URL,并在一段时间后解析url-checker。

但我不知道如何为延迟函数实现重复的setTimeout ..我尝试了checkProgress()调用自身的变体,但后来又不再返回。

以下是代码:

Lib.progressChecker = (function($) {
    'use strict';

    var api = {};

    var checkProgress = function (url) {
        var d = $.Deferred();

        $.get(url).done(function(foo) {

            if (foo === 'bar') {
                //script is not finished yet
            } else {
                //finished, resolve and stop looping
                d.resolve();
            }
        });

        return d.promise();
    };

    api.start = function(projectId) {

        var url = 'foobar/'+projectId;

        var d = $.Deferred();

        setTimeout(function(){
            checkProgress(url).done(function () {
                d.resolve();
            });
        }, 2000);

        return d.promise();

    };

    return api;

}) (jQuery);

1 个答案:

答案 0 :(得分:0)

你可以这样做,当你看到$.get()返回所需的值时,你只是解决了第一个延迟,如果没有,你再次运行它:

Lib.progressChecker = (function($) {
    'use strict';

    var api = {};
    api.start = function(projectId) {

        var url = 'foobar/'+projectId;
        var d = $.Deferred();

        function next() {
            setTimeout(function(){
                $.get(url).then(function(foo) {
                    if (foo === 'bar') {
                        // continue checking
                        next();
                    } else {
                        // done now
                        d.resolve(foo);
                    }
                }, function(err) {
                    // error so stop
                    // don't want to forever loop in an error condition
                    d.reject(err);
                });
            }, 2000);
        }

        next();
        return d.promise();
    };
    return api;

}) (jQuery);

仅供参考,如果你在这里控制服务器端,它看起来像webSocket的理想情况,你可以告诉服务器你希望在事情发生变化时通知服务器,服务器可以只是在服务器端发生变化时告诉你。