我了解JavaScript中没有原生的return (c+1)*2
或sleep
方法。但是,我知道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
答案 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进行交互,以便在任何地方使用它。
答案 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