Javascript ES6:在异步调用中使用生成器

Javascript ES6:在异步调用中使用生成器,javascript,asynchronous,ecmascript-6,generator,let,Javascript,Asynchronous,Ecmascript 6,Generator,Let,我读了DavidWalsh关于在异步任务()中使用生成器的文章,我也想做同样的事情。 这是我的密码: function request(time) { let rand = Math.random()*10; console.log(`rand is ${rand}`); setTimeout(function(rand){ it.next(rand) }, time); } function *main() { let result1

我读了DavidWalsh关于在异步任务()中使用生成器的文章,我也想做同样的事情。 这是我的密码:

function request(time) {
    let rand = Math.random()*10;
    console.log(`rand is ${rand}`);
    setTimeout(function(rand){
        it.next(rand)
    }, time);
}

function *main() {
    let result1 = yield request(5);
    result1 = parseInt(result1);
    let result2 = yield request(result1);

    console.log(`result1 is ${result1} and result2 is ${result2}`);
}

let it = main();
it.next();
但在控制台中我可以看到

rand is 6.367766260304355
rand is 0.3009188563265597
result1 is NaN and result2 is undefined
据我所知,当脚本到达let rand=Math.random()*10时,第一次将值保存为rand,但随后它进入setTimeout,但没有进入,而是到达它。下一步()在脚本末尾,然后返回setTimeout内部,但这次rand未定义。 为什么呢?如何保存rand的值并将其传递给result1

编辑: 好的,当我编辑的时候

function request(time) {
    setTimeout(function(){
        let rand = Math.random()*10;
        console.log(`rand is ${rand}`);
        it.next(rand)
    }, time);
}

它很好用。似乎我无法将值传递给setTimeout。。。为什么?

您可以将参数传递给计时器调用的函数,但不是您尝试的方式

您需要将这些参数传递给
setTimeout

但这在你的情况下是不必要的。您可以在内部功能范围内访问
rand

function request(time) {
    let rand = Math.random()*10;
    console.log(`rand is ${rand}`);
    setTimeout(function(){
        it.next(rand); 
    }, time);
}

代码中有两个
rand
变量:

let rand = Math.random()*10;
//  ^^^^
…
setTimeout(function(rand) {
//                  ^^^^
    …
}, time);
该函数的参数声明第二个变量,该变量从外部作用域隐藏该变量。由于回调函数没有传递任何参数,因此它的值是
未定义的
——这就是要传递给
下一个

只需不声明该参数,外部的
rand
将通过闭包在回调中可用

let rand = Math.random()*10;
//  ^^^^
…
setTimeout(function(rand) {
//                  ^^^^
    …
}, time);