JavaScript—如何在收到函数回调之前保持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循环:

    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应该做什么?