使用setTimeout延迟迭代

时间:2017-06-10 17:44:55

标签: javascript

我了解JavaScript中没有原生的return (c+1)*2sleep方法。但是,我知道wait方法,我试图用它来延迟循环中的执行。

我试图以三秒的间隔延迟迭代的打印(即0,1,2)。

setTimeout

输出:

function load () {
  for (var i = 0; i < 3; i++) {
      console.log(i);
      setTimeout(function() {console.log('sleeping three seconds')}, 3000);
  }
}

三秒后

0
1
2

但是,我试图在迭代之间暂停三秒钟,以便我执行:

(3) sleeping three seconds 

4 个答案:

答案 0 :(得分:1)

循环立即结束,它不会等待任何事情,所以你创建的所有超时都会在现在的三秒内执行!

如果要增加延迟,请将其乘以迭代器

function load() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log('sleeping three seconds');
    }, 3000 * (i + 1));
  }
}

load();

答案 1 :(得分:1)

另一种方式(非常优雅)这样做是递归调用函数。类似的东西:

function load(i) {
  if (i <= 3) {
    console.log(i);
    console.log("sleeping 3 seconds");
    setTimeout(function() {load(i + 1)}, 3000);
  }
}
load(0);

答案 2 :(得分:0)

等待等待等待

function timer(v){
 return new Promise(r=>setTimeout(r,v));
}

async function load () {
 for (var i = 0; i < 3; i++) {
  console.log(i);
  await timer(3000);
  }
}

load();

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

请注意,这是ES7,因此您需要与Babel进行交互,以便在任何地方使用它。

Transpiled

答案 3 :(得分:0)

您可以在标准浏览器承诺实施中添加延迟功能:

LRESULT CALLBACK IntPage1DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    UNREFERENCED_PARAMETER(wParam);

    BOOL myCondition = 0;
    LPNMHDR lpnm;
    switch (uMsg) {
    case WM_INITDIALOG:
        break;
    case WM_NOTIFY:
        lpnm = (LPNMHDR)lParam;
        switch (lpnm->code) {
        case PSN_SETACTIVE:

            if (myCondition) {
                PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
            }
            else {
                PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
            }

            break;

        case PSN_WIZFINISH:
            break;

        case PSN_WIZBACK:
            break;

        case PSN_RESET:
            break;

        default:
            break;
        }
        break;
    }
    return 0;
}

之后,您的功能可能如下所示:

Promise.prototype.delay = Promise.prototype.delay || function (ms) {
    return this.then(function () {
        let args = arguments;
        return new Promise(function (resolve) {
            setTimeout(function () {
                resolve.apply(this, args);
            }, ms);
        });
    });
};

此实现应适用于所有主流浏览器(不在IE 11中): https://caniuse.com/#search=Promise