Javascript 有没有一种方法可以在不使用wait关键字的情况下调用sleep()?
我想调用Javascript 有没有一种方法可以在不使用wait关键字的情况下调用sleep()?,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我想调用sleep()函数,但前面没有wait关键字。为了实现这一点,我尝试使用另一个带有回调的包装器异步函数sleepsync(x,callback),但没有成功 这是我的密码- function color() { let string1 = "yellow yeelow"; console.log(string1); let string2 = "blu glu"; console.log(string2); let string3 = "green freen";
sleep()
函数,但前面没有wait
关键字。为了实现这一点,我尝试使用另一个带有回调的包装器异步函数sleepsync(x,callback)
,但没有成功
这是我的密码-
function color() {
let string1 = "yellow yeelow";
console.log(string1);
let string2 = "blu glu";
console.log(string2);
let string3 = "green freen";
console.log(string3);
}
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
现在,函数调用可以正常工作-
async function fcall(loop = 2) {
for (let x = loop; x > 0; x--) {
color();
await sleep(2);
}
}
fcall(4);
在上面的调用方式中,每个迭代在继续之前等待2秒
下面的代码是sleep()
不等待2秒的地方-
async function sleepAsync(x, callback) {
callback();
await sleep(x);
}
function gcall(loop = 2) {
for (let x = loop; x > 0; x--) {
sleepAsync(2, color);
}
}
gcall(4);
这里可以做什么?我哪里出错了?您可以尝试npm的
sleep
软件包,请参见。如果后面的代码没有等待,异步函数将无法在准确的时间工作
当代码开始运行时,每个语句都将被添加到队列中,运行程序将使用该队列开始读取。异步函数将添加到队列的末尾
假设此代码:
let a = true;
doSomething();
doSomethingAsync();
doSomething2();
要执行的队列可以如下所示:
let a
doSomething
doSomething2
doSomethingAsync
let a
doSomthing
doSomethingAsync
doSomething2
但是如果您使用await
,异步代码将添加到调用它的位置。因此添加wait doSomethingAsync()代码>将使队列如下所示:
let a
doSomething
doSomething2
doSomethingAsync
let a
doSomthing
doSomethingAsync
doSomething2
TL;DR
当您希望立即执行代码时,可以使用wait
,而不是将其放入队列
JS有一个从运行到完成的保证,所以如果调用color()
它保证完全运行
没有办法以任何方式阻止它的执行。但是,有异步函数和生成器函数可以分段运行(意思是:直到达到wait
或yield
),因此如果您不想使用wait
,您必须yield
:
function* color() {
let string1 = "yellow yeelow";
console.log(string1);
yield;
let string2 = "blu glu";
console.log(string2);
yield;
let string3 = "green freen";
console.log(string3);
}
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
async function fcall() {
const it = color();
let done = false;
while(!done) {
({ done } = it.next());
await sleep(2);
}
}
睡眠不是JS程序设计的一部分,你想实现什么?如果你想在不使用async关键字的情况下对循环的每一个滴答都进行睡眠,我认为你可能必须将其重构为递归函数。但问题是为什么。我想暂停执行几秒钟,然后再恢复。那么,在每次sleep()
呼叫之前,我如何在不写wait
的情况下实现它呢?关于我为什么要这样做的问题,答案是——好奇。我对JS有点陌生,我想知道,有没有办法,因此可以传输问号.async/await,让它在不支持这种语法的浏览器上工作,所以有办法。如果你想让它在较旧的浏览器上运行,那么答案是“使用transpiler”,如果你真的想学习如何手工重写它,那么就尝试一下,如果你在尝试时遇到问题,就回到这里。谢谢,但我实际上是在寻找不依赖于该软件包的解决方案。你可以尝试使用child\u process.execSync
和timeout
选项,例如:typescript函数sleep(timeout){try{child\u process.execSync(`sleep${Math.ceil(timeout/1e3)},{timeout}}}catch{return}}
好的,明白了。谢谢所以我想我必须使用wait。没有别的办法..我没有想到用这种方式使用收益率。谢谢你。