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

Repeating function with Promise in js using setTimeout

我有一个小型库,只有一个 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);

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

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 的理想情况,而不是每两秒轮询一次,你可以告诉服务器你希望在事情发生变化时得到通知,并且服务器可以在服务器端发生变化时告诉您。