异步Javascript:意外的结果

异步Javascript:意外的结果,javascript,async-await,Javascript,Async Await,我正在自学异步JS,并编写了一个小测试程序来帮助我更好地理解它是如何工作的 我对这段代码的期望是,由于我在函数“TestPrime()”中设置了一个延迟,偶数将按顺序进行测试。但是,当代码运行时,数字按顺序运行。换言之,我期待的是: 3是质数 5是质数 2是素数 异步函数TestPrime(num){ 对于(变量i=2;i{},1500); } 如果(res==0){ 返回({number:num,prime:false}); } } 返回({number:num,prime:true});

我正在自学异步JS,并编写了一个小测试程序来帮助我更好地理解它是如何工作的

我对这段代码的期望是,由于我在函数“TestPrime()”中设置了一个延迟,偶数将按顺序进行测试。但是,当代码运行时,数字按顺序运行。换言之,我期待的是:

3是质数 5是质数 2是素数

异步函数TestPrime(num){ 对于(变量i=2;i{},1500); } 如果(res==0){ 返回({number:num,prime:false}); } } 返回({number:num,prime:true}); } 常数f=()=>{ 对于(var i=2;i{ if(p.prime) console.log('%s是prime',p.number); 其他的 console.log('%s不是prime',p.number); })); } } f(); 我确信这只是对异步JS编程的误解,但如果有人能帮我澄清一下,我将不胜感激


非常感谢

唯一需要延迟的是调用
()=>{}
——一个不执行任何操作的函数

setTimeout
不是睡眠功能。这就是异步的意义所在:其他一切都在不等待的情况下进行


要获得实际延迟,您需要在超时完成之前停止解析承诺

使用如下所示的经典promise语法:

函数TestPrime(num){
返回新承诺(解决=>{
for(设i=2;iresolve({
编号:num,
}), 1500);
}
如果(res==0){
返回解析({
编号:num,
});
}
}
决心({
编号:num,
});
});
}
常数f=()=>{
对于(var i=2;i{
if(p.prime)console.log('%s是prime',p.number);
else控制台日志('%s不是prime',p.number);
}));
}
};
f()
什么也不做。这实际上是禁止的

如果要延迟异步方法,可以按如下方式定义延迟方法:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function foo(){
   // do something
   await delay(1500);
   // do something else
}
这将返回一个在
ms
毫秒后解析的
Promise

它可以按如下方式使用:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function foo(){
   // do something
   await delay(1500);
   // do something else
}

setTimeout不会延迟当前函数的执行。它在指定的参数之后执行作为参数传递的函数(在本例中为空函数)delay@BaliBalo(脸掌)-啊!当然那么,有没有一种方法可以让我在函数中暂停?一个常见的技巧是
等待新的承诺(resolve=>setTimeout(resolve,1500))
正如其中一个答案中指出的那样,异步函数的执行只会在
wait
时停止。这非常有意义。感谢您的快速响应。为了我自己的启发,您提供的函数是否可以重新编写为:const delay=async ms=>(setTimeout(()=>{},ms))@Ishmael否。在您的示例中,在超时
ms
后,
setTimeout
调用回调
()=>{}
。回调没有效果。它什么也不做。等待依靠承诺来工作<代码>设置超时
与承诺无关。为了弥补这一差距,需要使用
Promise
构造函数。promise构造函数接受一个立即被调用的函数,框架传入两个函数,
resolve
reject
。当调用这两个函数中的任何一个时,承诺将成功地解决或解决错误。因此,我们
setTimeout
ms
之后调用此
resolve
。@Ishmael…这意味着承诺在时间段后成功解析。@Ishmael如果您想了解更多有关使用较旧形式的异步(例如
setTimeout
,回调等)接口
async/wait
代码的信息,然后您需要了解
newpromise((resolve,reject)=>{})
是如何运作的。