【发布时间】:2016-04-26 09:11:13
【问题描述】:
我正在使用自定义间隔函数来确保函数执行首先完成,直到下一次运行。一般来说,我会执行以下操作,我会检查 redis 数据库并检查作业是否由 sidekiq 执行。如果它被执行,我会向数据库发出请求以获取已写入的信息,如果在第 10 次之后没有我解析未定义的数据,我会运行此函数 10 次。我想知道我现在的解决方案是否可以改进。
const interval = (func, wait, times) => {
const interv = function(w, t){
return () => {
if (typeof t === 'undefined' || t-- > 0) {
setTimeout(interv, w);
try {
func.call(null);
}
catch (e) {
t = 0;
throw e.toString();
}
}
};
}(wait, times);
setTimeout(interv, wait);
};
let intervalCount = 0;
interval(() => {
intervalCount++;
redisClient.lrange('queue:default', 0, -1, (err, results) => {
const job = results.find((element) => { return JSON.parse(element).jid === jobId; });
if (job === undefined) {
checkDatabase(personId).then((result) => {
if (result) {
resolve(checkDatabase(personId));
} else if (intervalCount >= 10) {
resolve(undefined);
}
});
}
});
}, 1500, 10);
【问题讨论】:
-
您可以通过将
else添加到if (typeof t === 'undefined' || t-- > 0)来制作“done()” -
@BenjaminGruenbaum resolve is 'bluebird' promise 我没有将它包含在此代码 sn-p 中。
-
@dandavis 这是个好主意,我会试一试。我只想删除计数器 else 块
if (intervalCount >= 10) { resolve(undefined); } -
@IliaAptsiauri 承诺是一次性的,他们会得到解决一次。
-
好的,我会写一个答案。
标签: javascript asynchronous promise bluebird