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