我有一个包含单个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);
答案 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的理想情况,你可以告诉服务器你希望在事情发生变化时通知服务器,服务器可以只是在服务器端发生变化时告诉你。