博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
co模块的前端实现
阅读量:6535 次
发布时间:2019-06-24

本文共 2596 字,大约阅读时间需要 8 分钟。

其实就是照着网上的介绍和co的源码实现了一个自己用的前端async模块。支持RequireJS和SeaJS,支持$.ajax。

有喜欢co但是不知道怎么用的前端朋友可以拿去用。

co模块的意义和原理在sf上已经有详细的介绍了,具体参见:

用法:

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;}));

转载地址:http://nezdo.baihongyu.com/

你可能感兴趣的文章
Osmocom-BB中cell_log的多种使用姿势
查看>>
主库 归档 删除策略
查看>>
linux服务器多网卡bond
查看>>
Chrome 更新策略大变:优先安装 64 位版本
查看>>
《Linux从入门到精通(第2版)》——导读
查看>>
路过下载攻击利用旧版 Android 漏洞安装勒索软件
查看>>
ThinkSNS 六大子版本体验及源码下载
查看>>
《算法基础》——1.5实际因素
查看>>
《Java数字图像处理:编程技巧与应用实践》——第3章 基本Swing UI组件与图像显示 3.1 JPanel组件与BufferedImage对象的显示...
查看>>
为什么有人讨厌 Google 的新 Logo?
查看>>
2022 年 AI 会发展成什么样子,IBM 做出了 5 大预测
查看>>
腾讯2017暑期实习编程题3
查看>>
整理收藏一份PHP高级工程师的笔试题
查看>>
Intellij IDEA 构建Spring Web项目 — 用户登录功能
查看>>
[AHOI2013]作业
查看>>
git push被忽略的文件 处理
查看>>
C#中用ILMerge将所有引用的DLL打成一个DLL文件
查看>>
PHP生成HTML静态页面
查看>>
服务器启动django
查看>>
Makefile 中:= ?= += =的区别【转】
查看>>