当前位置: 首页 > news >正文

co模块的前端实现

其实就是照着网上的介绍和co的源码实现了一个自己用的前端async模块。支持RequireJS和SeaJS,支持$.ajax。
有喜欢co但是不知道怎么用的前端朋友可以拿去用。

co模块的意义和原理在sf上已经有详细的介绍了,具体参见:
http://segmentfault.com/a/1190000002732081

用法:

async(function* () {
    var a = yield Promise.resolve(1);
    console.log(a);
    var b = yield [Promise.resolve(2), Promise.resolve(3)];
    console.log(b);
    return 4;
}).then(function (value) {
    console.log(value);
}).catch(function (e) {
    // 异常处理
});

// 输出结果应该为 1 [2,3] 4

源码:

/*global exports*/
'use strict';
(function (factory) {
    // 各种模块加载方式的处理
    if (typeof define === 'function' && define.amd) {
        define([], factory);
    } else if (typeof define === 'function' && define.cmd) {
        define(function (require, exports, module) {
            module.exports = factory(jQuery);
        });
    } else if (typeof exports === 'object') {
        exports.async = factory();
    } else {
        // window.async=factory();
    }
}(function () {
    // 下面这俩函数是有用的
    function async(generator) {
        // 主Promise
        return new Promise(function (resolve, reject) {
            var g = generator();
            /**
             *  该函数会在异步过程执行完毕后被调用,会唤醒主函数继续执行到下一个yield或return为止。
             *  参数val为异步过程的结果,即promise.result。
             *  返回值为主函数内yield或return的结果,
             *  如果是yield则必须为promise或可被autoPack包装的对象,或者包含前两者的数组
             */
            function next(val) {
            
                // 将上次运行结果返回给主函数,令主函数继续执行到下一处中断,并将结果存入result
                var result = g.next(val);
                // 暂存主函数运行结果
                var promise = result.value;
                // 判断主函数是否执行完毕,执行完毕则调用resolve完成主Promise,否则继续执行
                if (!result.done) {
                    // 判断主函数提供的参数是否为数组,
                    // 如果不是数组则用autoPack封装后通过then(next)绑定下一步流程。并通过catch(reject)抛出异常
                    // 如果是数组则对每个成员进行封装后用Promise.All打包,然后继续执行。
                    if (promise instanceof Array) {
                        Promise.all(promise.map(autoPack)).then(next).catch(reject);
                    } else {
                        autoPack(promise).then(next).catch(reject);
                    }
                } else {
                    resolve(promise);
                }
            }

            // 捕获并通过reject抛出异常
            try {
                next();
            } catch (e) {
                reject(e);
            }
        })
    }

    // 自动打包,可以将第三方实现的Promise工具打包为ES6标准的Promise
    // 目前仅支持jQuery.Promise
    function autoPack(target) {
        // 包装$.ajax
        if (target.error) {
            return new Promise(function (resolve, reject) {
                target.done(resolve).error(reject);
            })
        } else {
            return target;
        }
    }

    return async;
}));

相关文章:

  • 【转】【支付 . 技术控】最全最强解析:支付宝系统架构内部剖析(架构图)...
  • 写给正在入坑linux系统的伙伴
  • 关于Activity销毁,而绘制UI的子线程未销毁出现的问题
  • BootStrap框架
  • Django3_Url控制系统和View视图
  • FastReport在线报表设计器工作原理
  • JavaScript是怎样AOP实现?
  • 常用公共DNS服务器地址
  • BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
  • TCP/IP中的四元组、五元组、七元组
  • Win8/Win10下程序经常无响应的解决办法
  • 使用zt-exec库定时清理linux休眠进程
  • 像素密度和分辨率
  • 链表的销毁与清空(转)
  • NChome如何创建单据跟主子表还有扩展开发要怎么弄?
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • canvas 高仿 Apple Watch 表盘
  • Electron入门介绍
  • es6
  • MaxCompute访问TableStore(OTS) 数据
  • PHP的Ev教程三(Periodic watcher)
  • sublime配置文件
  • 安装python包到指定虚拟环境
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 测试开发系类之接口自动化测试
  • 读懂package.json -- 依赖管理
  • 关于 Cirru Editor 存储格式
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何编写一个可升级的智能合约
  • 入门级的git使用指北
  • 删除表内多余的重复数据
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 如何在招聘中考核.NET架构师
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (06)Hive——正则表达式
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (力扣题库)跳跃游戏II(c++)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)图像的%2线性拉伸
  • (一)插入排序
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)shell调试方法
  • .axf 转化 .bin文件 的方法
  • .form文件_SSM框架文件上传篇
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?