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);
    
  • 相关阅读:
    [资料]PHP中的__autoload
    [转]php 5.3新增的闭包语法介绍function() use() {}
    [资料]PHP中的ReflectionClass
    [资料]PHP中的命名空间
    Mysql Event
    PHP转换成对像
    [转]Win7自带便签怎么恢复内容
    [转]Windows7便笺妙用
    [转]ASP.NET下MVC1.0>2.0>3.0>4.0
    PHP类动态属性问题
  • 原文地址:https://www.cnblogs.com/liumingwang/p/10254259.html
Copyright © 2011-2022 走看看