账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于(不知道的js中 yield的问题)
    21
    0
    function step(gen) {
        var it = gen();
        var last;
    
        return function () {
            last = it.next(last).value;
        }
    }
    
    var a = 1;
    var b = 2;
    function* foo() {
        a++; 
        yield;
        b = b * a; 
        a = (yield b) + 3; 
    }
    function* bar() {
        b--;  
        yield;
        a = (yield 8) + b; 
        console.log("这个时候的a",a); //9
        b = a * (yield 2); 
    }
    
    // 确保重新设置a和b
    a = 1;
    b = 2;
    var s1 = step(foo);
    var s2 = step(bar);
    //s2 和s1 的返回时独立的
    s2(); 
    s2(); 
    s1();
    s2(); 
    s1(); 
    s1(); //倒数第二步
    // 
    console.log('最后一步之前a', a, 'b', b);
    s2(); //最后一步
    console.log('a', a, 'b', b);

    我的疑惑就是,为什么倒数第二步的时候,a作为全局变量已经被改成12了,最后一步s2,
    执行 b = a (yield 2)这个表达式除了yiled 2 左边的部分,按逻辑上应该是b = a2;
    为啥b最后返回了一个18????。。。执行最后一步s2的时候,a的值还是9?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 龙们客 普通会员 1楼

      在JavaScript中,yield是一个强大的语法特性,它允许你使用函数的yield关键字来返回一个Promise、函数、链式调用或者可迭代的对象。当你需要在函数内部暂停函数的执行,并且等待某个条件满足时,你可以使用yield关键字来创建一个暂停的Promise

      以下是一个使用yield的例子:

      ```javascript function* myGenerator() { // 生成一个无限循环,每次循环都会执行yield语句 yield 1; yield 2; yield 3; }

      // 通过函数的call方法来调用myGenerator函数,并返回一个Promise let promise = myGenerator().then((result) => { // 当result被resolve时,我们可以访问result console.log(result); // 输出: 3 });

      // 如果我们没有在yield语句中指定返回值,那么函数会返回Promise的 fulfilled 状态 let value = yield 4; console.log(value); // 输出: 4 ```

      在这个例子中,myGenerator函数生成了一个无限循环,每次循环都会执行yield语句。当我们调用myGenerator函数,并通过myGenerator().then((result) => { ... })来调用它并返回一个Promise时,myGenerator函数会返回一个Promise,并且myGenerator函数的fulfilled状态会成为Promisefulfilled状态。

      需要注意的是,yield语句必须放在一个PromiseGeneratorcatch块中。否则,PromiseGeneratorfulfilled状态不会被触发,而是一个rejected状态。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部