JavaScript—如何在收到函数回调之前保持for循环
以下是我的for循环:JavaScript—如何在收到函数回调之前保持for循环,javascript,Javascript,以下是我的for循环: for (var d = startDate; d <= in30DaysDate; d.setDate(d.getDate() + 1)) { var loopDay = new Date(d); DoYourDaylyJob(); console.log("Day:" + loopDay); } 我应该在函数DoYourDailyJob中添加什么,以防止循环在第二天开始执行它的日常工作 我希望我描
for (var d = startDate; d <= in30DaysDate; d.setDate(d.getDate() + 1)) {
var loopDay = new Date(d);
DoYourDaylyJob();
console.log("Day:" + loopDay);
}
我应该在函数DoYourDailyJob中添加什么,以防止循环在第二天开始执行它的日常工作
我希望我描述得足够好。我是否应该在DoYourDailyJob上附加任何类型的函数回调,但如果是这样的话,在收到函数的响应之前,如何防止循环继续进行
我不知道这是否可能。如果可能的话,你能举个例子来回答这个问题吗?只要回复DoYourDailyJob的一个承诺,就可以了:
(async function() {
for (var d = startDate; d <= in30DaysDate; d.setDate(d.getDate() + 1)) {
var loopDay = new Date(d);
await DoYourDaylyJob();
console.log("Day:" + loopDay);
}
})()
只要回复DoYourDailyJob的承诺,那么它就简单到:
(async function() {
for (var d = startDate; d <= in30DaysDate; d.setDate(d.getDate() + 1)) {
var loopDay = new Date(d);
await DoYourDaylyJob();
console.log("Day:" + loopDay);
}
})()
使用回调函数,将for替换为递归循环:
executeIteration(startDate);
function executeIteration(d) {
if (d <= in30DaysDate)
return;
var loopDay = new Date(d);
DoYourDaylyJob(function(valueFromDoYourDaylyJob) {
executeIteration(d.setDate(d.getDate() + 1)));
});
}
function DoYourDaylyJob(callback) {
// Do your dayly job
var valueToReturn = "foo";
callback(valueToReturn);
}
使用回调函数,将for替换为递归循环:
executeIteration(startDate);
function executeIteration(d) {
if (d <= in30DaysDate)
return;
var loopDay = new Date(d);
DoYourDaylyJob(function(valueFromDoYourDaylyJob) {
executeIteration(d.setDate(d.getDate() + 1)));
});
}
function DoYourDaylyJob(callback) {
// Do your dayly job
var valueToReturn = "foo";
callback(valueToReturn);
}
所有这些评论都是错误的,在某些环境中这是绝对可能的 如果您有async Wait可用,您可以非常轻松地完成它。做好你的日常工作;异步函数返回一个promise和do
for () {
await DoYourDailyJob();
}
如果您没有async Wait可用,请在此处进行注释,我们可以对原始承诺执行类似操作。所有这些注释都是错误的,在某些环境中,这是绝对可能的 如果您有async Wait可用,您可以非常轻松地完成它。做好你的日常工作;异步函数返回一个promise和do
for () {
await DoYourDailyJob();
}
如果您没有async Wait可用,请在此处进行注释,我们可以对原始承诺执行类似操作。只需重构它,使其递归:
var day = 0;
var loops = 10;
function DoYourDailyJob(){
var loopDay = new Date(d);
console.log("Day:" + loopDay);
if( day++ < loops ){
DoYourDailyJob();
}
}
DoYourDailyJob();
只需重构它,使其递归:
var day = 0;
var loops = 10;
function DoYourDailyJob(){
var loopDay = new Date(d);
console.log("Day:" + loopDay);
if( day++ < loops ){
DoYourDailyJob();
}
}
DoYourDailyJob();
简短的回答,你至少不能没有一个超级丑陋的拦截电话,我不能强烈建议你避免 相反,让它异步 如果DoYourDailyJob是异步的,那么您可以: 接受完成时调用的回调函数 返回完成时已解决的承诺 如今,Promise方法更为可取:
function DoYourDailyJob() {
return new Promise((resolve, reject) => {
// do stuff
// call resolve() when done
// call reject() if there is an error
});
}
在for循环中,创建要处理的日期数组:
const dates = [];
for (var d = startDate; d <= in30DaysDate; d.setDate(d.getDate() + 1)) {
dates.push(new Date(d));
}
或者,如果需要一次一个地运行它们(可能是因为您没有传递日期),那么您基本上可以拥有一个队列和一个队列运行函数,该函数将一直运行,直到所有这些都完成:
const runNextDay = () => {
if (!dates.length) {
return Promise.resolve(); // all done
}
const day = dates.shift();
return DoYourDailyJob().then(() => console.log('loop date', day))
.then(runNextDay); // call the next day when its done
};
runNextDay()
.then(() => console.log('all done'));
简短的回答,你至少不能没有一个超级丑陋的拦截电话,我不能强烈建议你避免 相反,让它异步 如果DoYourDailyJob是异步的,那么您可以: 接受完成时调用的回调函数 返回完成时已解决的承诺 如今,Promise方法更为可取:
function DoYourDailyJob() {
return new Promise((resolve, reject) => {
// do stuff
// call resolve() when done
// call reject() if there is an error
});
}
在for循环中,创建要处理的日期数组:
const dates = [];
for (var d = startDate; d <= in30DaysDate; d.setDate(d.getDate() + 1)) {
dates.push(new Date(d));
}
或者,如果需要一次一个地运行它们(可能是因为您没有传递日期),那么您基本上可以拥有一个队列和一个队列运行函数,该函数将一直运行,直到所有这些都完成:
const runNextDay = () => {
if (!dates.length) {
return Promise.resolve(); // all done
}
const day = dates.shift();
return DoYourDailyJob().then(() => console.log('loop date', day))
.then(runNextDay); // call the next day when its done
};
runNextDay()
.then(() => console.log('all done'));
您必须创建一个递归函数,而不是for循环。只要做一个函数,当它完成时,它会一直调用自己,直到某个变量的值高于循环的数量。像这样,var循环=0;函数递归{if loops++<10{console.log loops;递归;}递归你真的需要按顺序进行吗?如果是这样,这是什么类型的操作?网络请求?通常这样的操作可以处理批处理。这里不是这样吗?你必须生成一个递归函数,而不是for循环。只需生成一个函数,在完成时不断调用自己,直到某个变量有值为止e大于循环的数量。如下所示,var loops=0;函数recursive{if loops++<10{console.log loops;recursive;}递归你真的需要按顺序进行吗?如果需要,这是什么类型的操作?网络请求?通常这样的操作可以处理一个批处理。这里不是这样吗?你每天都会学到一些新的东西-这让我查找wait和async关键字,这很有趣。我觉得这段代码读起来不太愉快正因为如此。@something在这里,我想您在试用nodejs后会改变对async/Wait的看法。当您执行大量db请求等并必须编写结果时,它确实会改进代码。@JonasW。您所说的承诺是什么意思?您能添加一个示例说明DoYourDaylyJob函数应该包含哪些内容吗?@tony这取决于您什么我们的日常工作应该做些什么?你每天都会学到一些新的东西-这让我查找await和async关键字,这很有趣。但我觉得这段代码读起来不太愉快,因为它。@something在这里,我想你在尝试nodejs后会改变你对async/await的看法。当你做了大量的db请求时,它确实改进了代码“你所说的承诺是什么意思?你能给我举个例子吗?”“你能做什么?” YourDaylyJob函数应该包含?@tony由您决定您的DaylyJob应该做什么?