node.js - 求解 你不知道的JavaScript中 Generator+Promise的一段示例代码

查看:89
本文介绍了node.js - 求解 你不知道的JavaScript中 Generator+Promise的一段示例代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

function foo(x,y) {
    return request(
        //request是一个Promise对象
        "http://some.url.1/?x=" + x + "&y=" + y
    );
}

function *main() {
    try{
        var text = yield foo( 11, 31 );
        //在yield处暂停后 yield需要等待第二次next()传值 text应该没有被赋值
        console.log( text );
    }
    catch (err) {
        console.error( err );
    }
}

var it = main();

var p = it.next().value;
//等待promise p决议
p.then(
    function (text) {
        it.next( text );
        //这里拿到的 text 应该没有赋到值呀
    },
    
    function (err) {
        it.throw( err );
    }
);

这是你不知道的JavaScript 生成器+Promise 小节中的一段示例代码
**其中 text 应该拿到的是yield 的值 而yield 应该需要第二个next()去赋值 那么 text应该是undefined 这里我就看不懂了 求解!**

解决方案

迭代器调用一次next后,就会在yield语句行处停止执行,等到下一次next方法被调用,才会继续向下走

    return request(
        //request是一个Promise对象
        "http://some.url.1/?x=" + x + "&y=" + y
    );
}

function *main() {
    try{
        var text = yield foo( 11, 31 );//[1]
        console.log( text );
    }
    catch (err) {
        console.error( err );
    }
}

var it = main();//利用Generator函数,生成一个迭代器对象
var p = it.next().value;//迭代器执行第1次next,返回结果,其中value值为foo( 11, 31 )的执行结果-一个Promise对象
//Promise对象的函数接受Promise的结果,成功调用第1个函数参数,失败调用第2个函数参数
p.then(
    function (text) {//text值为Promise成功完成的结果值
        it.next( text );//将text作为迭代器next方法的参数,返回作为yield表达式的返回值 [1],并且迭代器继续向下执行,执行[2],输出结果
    },
    
    function (err) {
        it.throw( err );
    }
);

代码简化下

function foo(x,y) {
    return new Promise(function(resolve,reject){
        
        setTimeout(function(){
           resolve("~~~foo完成了~~"+(x+y));
        },5000);
    });
}

function *main() {
    try{
        var text = yield foo( 11, 31 );
        console.log( text );
    }
    catch (err) {
        console.error( err );
    }
}

var it = main();

var p = it.next().value;
p.then(
    function (text) {
        //输出执行结果
        console.log("我知道了>>"+text);
        //将结果返回给迭代器
        it.next( text );
    },
    
    function (err) {
        it.throw( err );
    }
);

这篇关于node.js - 求解 你不知道的JavaScript中 Generator+Promise的一段示例代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆