你会如何对node.js中的一系列回调应用时间限制?
使用异步库会更容易吗?
谢谢你,你可以看到我正在努力使用异步javascript。
答案 0 :(得分:0)
不要直接调用下一步,而是调用以下函数 doNext :您实际的下一步 stepData :您的参数加上执行时间限制(以毫秒为单位) unDoThis :如果必须撤消刚刚完成的工作,则要运行的功能
function nextStep(doNext, stepData, unDoThis) {
第一次设置超时
if (!stepData.expireAt) {
var currentDate = new Date();
stepData.expireAt = currentDate.setMilliseconds(currentDate.getMilliseconds() + stepData.runMiliseconds);
console.log(new Date().toISOString() +" We will expire at "
+ new Date(stepData.expireAt).toISOString());
};
记住如何撤消上一步完成的步骤
if (!stepData.unDoAll) stepData.unDoAll = [];
if (unDoThis) stepData.unDoAll.push(unDoThis);
如果时间已过,请撤消所有已完成的步骤
if (new Date(stepData.expireAt) < new Date().getTime()) {
while (stepData.unDoAll.length) {
var unDoOne = stepData.unDoAll.pop();
unDoOne();
}
console.log(new Date().toISOString() +' That was it!');
否则执行下一步
} else {
doNext(stepData, Array.prototype.slice.call(arguments, 2));
}
}
从下面的工作者函数中,我们将建立我们将中断的链
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
function oneStep(stepData) {
console.log (new Date().toISOString() +' ('+ stepData.nrIterations +') I do some stuff ');
sleep(100);
var myIteration = stepData.nrIterations--;
if (stepData.nrIterations) {
nextStep(otherStep, stepData);
}
}
function otherStep(stepData) {
console.log (new Date().toISOString() +' ('+ stepData.nrIterations +') I do more stuff, leaving a trace');
sleep(100);
var myIteration = stepData.nrIterations--;
if (stepData.nrIterations) {
nextStep(oneStep, stepData, function () {
console.log(new Date().toISOString() +' ('+ myIteration +') I clean some trace ');
});
}
}
现在我们使用它。 使用runMiliseconds和nrIterations来查看效果
console.log (new Date().toISOString() + ' About to start ');
var currentDate = new Date();
nextStep(oneStep, {
runMiliseconds : 250,
nrIterations: 22
});