异步Javascript:意外结果

时间:2019-07-11 12:39:06

标签: javascript async-await

我正在自学异步JS,并编写了一个小型测试程序来帮助我更好地了解其工作原理。

我对这段代码的期望是,由于我在函数“ TestPrime()”中添加了延迟,因此偶数测试会不按顺序进行。但是,代码运行时,数字按顺序运行。换句话说,我期待的事情大致如下:

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

async function TestPrime(num) {

    for(var i = 2; i < num; i++){

        let res = num % i;

        if (num % 2 == 0) {
            setTimeout(()=>{}, 1500);
        }

        if (res == 0) {
            return ({number: num, prime: false});
        }
    }

    return ({ number: num, prime: true});
}

const f = ()=>{
    for (var i = 2; i <= 50; i++){

        if (TestPrime(i).then(p => { 
            if (p.prime)
                console.log('%s is prime', p.number);
            else    
                console.log('%s is NOT prime', p.number);
        }));
    }
}

f();

我敢肯定这只是异步JS编程的菜鸟误解,但如果有人可以让我直言不讳,我将非常有义务。

非常感谢!

2 个答案:

答案 0 :(得分:3)

setTimeout(()=>{}, 1500);

什么都不做。实际上,这是一个不可操作的操作。

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

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

这将返回一个Promise,该毫秒在ms毫秒后解析。

它可以如下使用:

async function foo(){
   // do something
   await delay(1500);
   // do something else
}

答案 1 :(得分:2)

您唯一要延迟的是调用serialCount = serialCount.replace(/[AS]/g, ''); ,此功能不执行

()=>{}不是睡眠功能。这就是异步的意义:其他所有事情都可以继续进行而无需等待。


要实际延迟,您需要停止兑现承诺,直到超时完成。

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

setTimeout