zoukankan      html  css  js  c++  java
  • promise和生成器的结合

    if(Promise.wrap){
        Promise.wrap = function(fn){
            return function(){
                var args = [].slice.call(arguments);
                return new Promise(function(resolve,reject){
                    args.push(function(err,data){
                        if(err){
                            reject(err);
                        }else{
                            resolve(data);
                            
                        }
                    });
                    fn.apply(null,args)
                })
            }
            
        }   
    }
    
    function myajax(url,cb){
        $.ajax({
            url: url,
            type: 'GET',
        })
        .done(function(msg) {
            cb(null,msg)
            //console.log("success");
        })
        .fail(function(err) {
            cb(err)
            //console.log("error");
        })  
    }
    
    var request = Promise.wrap(myajax);
    
    function run(gen) {
        var args = [].slice.call(arguments, 1),
            it;
        // 在当前上下文中初始化生成器
        it = gen.apply(this, args);
        // 返回一个promise用于生成器完成
        return Promise.resolve()
            .then(function handleNext(value) {
                // 对下一个yield出的值运行
                var next = it.next(value);
                return (function handleResult(next) {
                    // 生成器运行完毕了吗?
                    if (next.done) {
                        return next.value;
                    }
                    // 否则继续运行
                    else {
    
                        return Promise.resolve(next.value)
                            .then(
                                // 成功就恢复异步循环,把决议的值发回生成器
                                handleNext,
                                // 如果value是被拒绝的 promise,
                                // 就把错误传回生成器进行出错处理
                                function handleErr(err) {
                                    return Promise.resolve(
                                            it.throw(err)
                                        )
                                        .then(handleResult);
                                }
                            );
                    }
                })(next);
            });
    }
    
    function *lmw(){
        var mw1 = yield request('/test');
        console.log(mw1);
        var mw2 = yield 1+mw1;
        console.log(mw2);
        console.log('over');
    }
    
    run(lmw);
    
  • 相关阅读:
    使用 lntelliJ IDEA 创建 Maven 工程的springboot项目
    HTTP协议小记
    TCP/UDP的网络底层实现
    TCP的三次握手和四次挥手
    IP地址和MAC地址绑定的必要性
    什么是回调函数?
    基于TCP实现的Socket通讯详解
    HTTP协议随笔
    计算机虚拟世界的入门常识(1)——信号的原理
    UDP比TCP好用的优势
  • 原文地址:https://www.cnblogs.com/liumingwang/p/10254259.html
Copyright © 2011-2022 走看看