异步Javascript:意外的结果
我正在自学异步JS,并编写了一个小测试程序来帮助我更好地理解它是如何工作的 我对这段代码的期望是,由于我在函数“TestPrime()”中设置了一个延迟,偶数将按顺序进行测试。但是,当代码运行时,数字按顺序运行。换言之,我期待的是: 3是质数 5是质数 2是素数 异步函数TestPrime(num){ 对于(变量i=2;i异步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});
非常感谢 唯一需要延迟的是调用
()=>{}
——一个不执行任何操作的函数
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)=>{})
是如何运作的。