let msg = "Done";
function promise() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Done");
}, 2000);
});
}
async function func1() {
msg = "Pending";
console.log("Starting...");
const a = await promise();
console.log(a);
msg = a;
}
async function func2() {
console.log("Queued");
}
async function call() {
if ((msg) === "Done") {
func1();
} else {
func2();
}
}<h1>PROMISE</h1>
<input onclick="call()" type="button" value="Click me " />
我将这段代码添加到func2()中,它在解决之前的承诺后运行func1(),但在单击之后也会立即运行。我怎么能这样做,它只运行后,先前的承诺是解决。
func2() {
console.log("Queued");
await func1();
func1();
}编辑:伙计们!我使用Date().getTime()方法解决了这个问题,并添加了"clicks“变量。结果几乎是一样的。但是这样做的方式是不同的。当我点击它立即开始执行承诺,但我希望它等待,直到上次点击的承诺完成,然后才开始执行一个新的承诺。我想肯定还有其他更简单的解决办法。
let msg = "Done";
let clicks = 0;
let t1;
let t2;
let timeout = 0;
let txt = "";
function promise() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Done");
}, 2000 * clicks - timeout);
});
}
async function func1() {
clicks = 1;
timeout = 0;
txt = "";
msg = "Pending";
let time = new Date();
t1 = time.getTime();
const a = await promise();
let taym = new Date();
let now = taym.getTime();
createDiv(now, t1, txt);
msg = a;
}
async function func2() {
clicks++;
let time = new Date();
t2 = time.getTime();
timeout = t2 - t1;
const a = await promise();
let taym = new Date();
let now = taym.getTime();
txt = " and " + (now - t2) + " ms after last click";
createDiv(now, t1, txt);
}
async function call() {
if (msg === "Done") {
func1();
} else {
func2();
}
}
function createDiv(a, b, c) {
let div = document.createElement("div");
div.innerHTML = "Created " + (a - b) + " ms after main click" + c;
document.body.appendChild(div);
}<h1>PROMISE</h1>
<input onclick="call()" type="button" value="Click me " />
发布于 2022-04-01 12:11:17
下面的代码可以实现我认为你想要的
解析该事件,只是为了显示第二次单击中显示的timeStamp是第一个单击timeStamp,因为在本例中,这就是承诺的解决方案。
但不确定这段代码有多有用
const promise = new Promise(resolve => {
document.getElementById('bang').addEventListener('click', e => {
console.log('first click');
resolve(e);
}, { once: true });
})
promise.then(e => {
console.log(e.timeStamp, e.type, e.target.id);
document.getElementById('bang').addEventListener('click', e => {
promise.then(e => {
console.log('not the first click');
console.log(e.timeStamp, e.type, e.target.id);
})
})
})<button id="bang">Resolve the promise</button>
https://stackoverflow.com/questions/71706480
复制相似问题