gpt4 book ai didi

javascript - 如何在每次函数调用前等待 setTimeout?

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:29 25 4
gpt4 key购买 nike

我需要使用多个参数多次调用一个函数。我希望在上一次调用超时完成后调用它。我尝试了以下方法,但它似乎无法正常工作。 (Here's the JSFiddle)。

现在它只是在第一次调用后等待。我知道这不是正确的方法,但我找不到任何正确显示如何操作的示例。我还需要将其转换为 typescript,因此请在回答时考虑这一点。

<!DOCTYPE html>
<html>
<body>

<p>Click the button to wait 3 seconds, then alert "Hello".</p>

<button onclick="call()">Call all methods</button>

<script>
var myVar;

function call(){
myFunction('normal1','heading1','message1');
myFunction('normal2','heading2','message2');
myFunction('normal3','heading3','message3');

/*Output should be:
(first time dont wait)
heading1 message1
(then wait for timeout and remove the elements)
heading2 message2
(then wait for timeout and remove the elements)
heading3 message3
*/
}

function myFunction(msgType,heading,message) {
console.log(!!document.getElementById("snackbarParent"),document.getElementById('snackbarParent'));
if(document.getElementById("snackbarParent") == null)
{
alertFunc(msgType,heading,message);
}
else{
setTimeout(function(){
let parent = document.getElementById('snackbarParent');
parent.parentNode.removeChild(parent);
alertFunc(msgType,heading,message);
},3500);
}
}

function alertFunc(msgType,heading,message) {

let div = document.createElement('div');
div.className = 'snackbarParent';
div.id = "snackbarParent";
div.innerHTML = '<div id="snackbar"><b style="color:' + msgType + '"> ' + heading + ' </b>' + message + '</div>';

document.documentElement.appendChild(div);
// Get the snackbar DIV
let x = document.getElementById("snackbar");

// Add the "show" class to DIV
x.className = "show";
setTimeout(function(){
x.className = x.className.replace("show", "");
alert("Should display "+heading+" "+message+" now!");
}, 3000);

}
</script>

</body>
</html>

注意事项:

函数 call() 仅用于表示目的。参数可以是任意值,函数 myFunction() 可以随时随地调用。

最佳答案

由于这个问题用 typescript 标记,我假设用 Typescript 写这个是一个选项。

您可以使用 async/await 轻松实现您想要的效果,同时您的代码保持正常外观:

var myVar;

async function call(){
await myFunction('normal1', 'heading1', 'message1');
await myFunction('normal2', 'heading2', 'message2');
await myFunction('normal3', 'heading3', 'message3');
}
function timeout(delay: number) {
return new Promise(r => setTimeout(r, delay));
}
async function myFunction(msgType: string, heading: string, message: string) {
console.log(!!document.getElementById("snackbarParent"), document.getElementById('snackbarParent'));
if (document.getElementById("snackbarParent") == null) {
await alertFunc(msgType, heading, message);
}
else {
await timeout(3500);

let parent = document.getElementById('snackbarParent');
parent.parentNode.removeChild(parent);
await alertFunc(msgType, heading, message);

}
}

async function alertFunc(msgType, heading, message) {

let div = document.createElement('div');
div.className = 'snackbarParent';
div.id = "snackbarParent";
div.innerHTML = '<div id="snackbar"><b style="color:' + msgType + '"> ' + heading + ' </b>' + message + '</div>';

document.documentElement.appendChild(div);
// Get the snackbar DIV
let x = document.getElementById("snackbar");

// Add the "show" class to DIV
x.className = "show";
await timeout(3000);
x.className = x.className.replace("show", "");
alert("Should display " + heading + " " + message + " now!");

}

注意:如果您不需要 typescript ,babel 也支持async/await,但您仍然需要一个转译器。

注意 要使用 async/awaites5 编译,如果 promises 不是,您将需要一个 Priomise 库t 在环境中,您可以使用流动的 tconfig.json:

"compilerOptions": {
"target": "es5",
"lib": [
"es5",
"es2015.promise",
"dom"
]
}

纯 js 方法可以使用 onDone 回调来通知调用者函数何时真正完成。这比直接在 alertFunc 中添加代码更好,因为其他答案建议这样会使 alertFunc 的可重用性降低:

function call() {
myFunction('normal1', 'heading1', 'message1', function () {
myFunction('normal2', 'heading2', 'message2', function () {
myFunction('normal3', 'heading3', 'message3', function () {
// DOne
});
});
});
}
function myFunction(msgType, heading, message, onDone) {
console.log(!!document.getElementById("snackbarParent"), document.getElementById('snackbarParent'));
if (document.getElementById("snackbarParent") == null) {
alertFunc(msgType, heading, message, onDone);
}
else {
setTimeout(function () {
var parent = document.getElementById('snackbarParent');
parent.parentNode.removeChild(parent);
alertFunc(msgType, heading, message, onDone);
}, 3500);
}
}
function alertFunc(msgType, heading, message, onDone) {
var div = document.createElement('div');
div.className = 'snackbarParent';
div.id = "snackbarParent";
div.innerHTML = '<div id="snackbar"><b style="color:' + msgType + '"> ' + heading + ' </b>' + message + '</div>';
document.documentElement.appendChild(div);
// Get the snackbar DIV
var x = document.getElementById("snackbar");
// Add the "show" class to DIV
x.className = "show";
setTimeout(function () {
x.className = x.className.replace("show", "");
alert("Should display " + heading + " " + message + " now!");
if (onDone)
onDone();
}, 3000);
}

关于javascript - 如何在每次函数调用前等待 setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47808538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com