我想在没有sleep()
关键字的情况下调用await
函数。为了实现这一点,我尝试了另一个带有回调的 wrapper-async 函数sleepAsync(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);
在这里可以做什么?我在哪里犯错?
答案 0 :(得分:0)
您可以从npm试用sleep
软件包,请在https://www.npmjs.com/package/sleep上查看。
答案 1 :(得分:0)
如果后面的其余代码没有等待异步功能,那么异步功能将无法在确切的时间工作。
当代码开始运行时,每个语句将被添加到队列中,并且运行程序将开始使用该队列进行读取。异步功能将添加到队列的末尾。
假设此代码:
let a = true;
doSomething();
doSomethingAsync();
doSomething2();
要执行的队列可以像这样:
let a
doSomething
doSomething2
doSomethingAsync
但是您使用await
时,异步代码将被添加到您调用它的位置。因此,添加await doSomethingAsync();
将使队列如下:
let a
doSomthing
doSomethingAsync
doSomething2
TL; DR
要立即执行代码而不是将其放在队列中时,请使用
await
。
答案 2 :(得分:0)
JS具有运行到完成保证,因此,如果您调用color()
,则可以保证完全运行
无法以任何方式停止执行。但是,有 async函数和 generator函数可以分段运行(意味着:直到达到await
或yield
为止),所以如果您不想使用await
,则必须使用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);
}
}