Promise A 规范的一个简单的浏览器端实现
简单的实现了一个promise 的规范,留着接下来模块使用。感觉还有很多能优化的地方,有时间看看源码,或者其他大神的代码
主要是Then 函数。回调有点绕人。
!(function(win) {
function Task(resolver) {
if (!resolver || (typeof resolver).toUpperCase() != 'FUNCTION') {
throw 'task arg is function,and is must';
return;
}
if (!(this instanceof Task)) return new Task(resolver);
var self = this;
//PENDING,FULFILLED,REJECTED
self.statu = 'PENDING';
self.callbackok = null;
self.callbackreject = null;
self.value = null;
self.reason = null;
function resolve(data) {
self.statu = 'FULFILLED';
self.value = data || {};
self.callbackok && self.callbackok(self.value);
}
function reject(reason) {
self.statu = 'REJECTED';
self.reason = reason || {};
self.callbackreject && self.callbackreject(self.reason);
}
resolver(resolve, reject);
}
Task.all = function(arr) {
if (!(arr instanceof Array)) {
throw 'arr must be Task Array';
return;
}
return Task(function(resolve, reject) {
var dataarr = {};
var len = arr.length;
for (var i = 0; i < len; i++) {
(function(c) {
console.log(arr[c]);
arr[c].then(function(data) {
dataarr[c] = data;
len--;
if (len == 0) {
var data = new Array(len);
for (var item in dataarr) {
data[item] = dataarr[item];
}
resolve(data);
}
}, function(error) {
reject(error);
})
})(i)
}
})
}
//创建一个成功状态的Task对象
Task.resolve = function(value) {
return new Task(function(resolve) {
resolve(value);
})
}
Task.prototype.then = function(onFulfilled, onRejected) {
var task = this;
return Task(function(resolve, reject) {
function callback(value) {
var ret = (typeof onFulfilled).toUpperCase() == 'FUNCTION' && onFulfilled(value) || value;
if (isThenable(ret)) {
ret.then(function(value) {
resolve(value);
}, function(reason) {
reject(reason);
});
} else {
resolve(ret);
}
}
function errorback(reason) {
reason = (typeof onRejected).toUpperCase() == 'FUNCTION' && onRejected(reason) || reason;
reject(reason);
}
if (task.statu === 'PENDING') {
task.callbackok = callback;
task.callbackreject = errorback;
} else if (task.statu === 'FULFILLED') {
callback(task.value);
} else if (task.statu === 'REJECTED') {
errorback(task.reason);
}
});
}
var isThenable = function(obj) {
return obj && typeof obj['then'] == 'function';
}
window.Task = Task;
})(window)
下面是几种调用
串行
var task = new Task(function(resolve, reject) {
setTimeout(function() {
resolve('aaaa');
}, 100);
})
var task1 = function() {
return new Task(function(resolve, reject) {
setTimeout(function() {
resolve('bbbb');
}, 100);
})
}
var task2 = function() {
return new Task(function(resolve, reject) {
setTimeout(function() {
resolve('cccc');
}, 100);
})
}
var task3 = function() {
return new Task(function(resolve, reject) {
setTimeout(function() {
reject('dddd');
}, 100);
})
}
task.then(task1).then(task2).then(task3).then(function(data) {
console.log(data)
}, function(error) {
console.log(data)
});
并行
var task = new Task(function(resolve, reject) {
setTimeout(function() {
resolve('aaaa');
}, 100);
})
var task2 = new Task(function(resolve, reject) {
setTimeout(function() {
resolve('aaaa');
}, 100);
})
var task3 = new Task(function(resolve, reject) {
setTimeout(function() {
resolve('aaaa');
}, 100);
})
var task4 = new Task(function(resolve, reject) {
setTimeout(function() {
resolve('aaaa');
}, 100);
})
var task5 = new Task(function(resolve, reject) {
setTimeout(function() {
resolve('aaaa');
}, 100);
})
//并行
Task.all([task,task2,task3,task4,task5]).then(function(data){ console.log(data)})
创建一个一开始就是 释放状态的 task
Task.resolve('data').then(function(data){
console.log(data);
})
Promise A 规范的一个简单的浏览器端实现的更多相关文章
- Pyqt 一个简单的浏览器
使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ...
- 【Java】 实现一个简单文件浏览器(1)
学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...
- SeaJS:一个适用于 Web 浏览器端的模块加载器
什么是SeaJS?SeaJS是一款适用于Web浏览器端的模块加载器,它同时又与Node兼容.在SeaJS的世界里,一个文件就是一个模块,所有模块都遵循CMD(Common Module Definit ...
- 【Java】 实现一个简单文件浏览器(2)
接着上篇文章 接下来说下程序右侧的文件内容表格如何实现 FileTable类: FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为FileT ...
- 遵循amd规范的require.js(适合浏览器端)
1. 下载require.js 2. 引用 html <!DOCTYPE html> <html lang="en"> <head> <m ...
- 一个简单的 PC端与移动端的适配(通过UA)
只需在header引用个js文件, 原理就是判断UA里面的标识. 加下面代码添加到js文件,在头文件引用即可 var Pc_url = 'http://www.baidu.com'; //PC端网址 ...
- 从零开始搭建一个简单的基于webpack的vue开发环境
原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...
- django写一个简单的登陆注册
要写这个,前提还是需要知道三个知识: 一个是urls.py,它是写我们的路由关系的,之前我写了通过wsgiref写一个简单的服务端,也用到了路由,就是 请求过来的url和视图函数的对应关系. 二是就是 ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
随机推荐
- java 基本类型之间的转换
基本数据类型从低级到高级是:byte short int long float double ,char 类型比int 类型之后的都要低 下面通过一个例子说明: import javax.swing ...
- 20150618_Andriod _set Dialog_弹出式菜单
参考地址: http://blog.csdn.net/zhyl8157121/article/details/8169172 http://blog.csdn.ne ...
- The Happy Worm 分类: POJ 排序 2015-08-03 18:57 5人阅读 评论(0) 收藏
The Happy Worm Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 4698 Accepted: 1047 Descr ...
- THE DRUNK JAILER 分类: POJ 2015-06-10 14:50 13人阅读 评论(0) 收藏
THE DRUNK JAILER Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24918 Accepted: 1563 ...
- Linux 多线程应用中如何编写安全的信号处理函数
http://blog.163.com/he_junwei/blog/static/1979376462014021105242552/ http://www.ibm.com/developerwor ...
- HDU(2089),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others ...
- 基于busybox和LFS的linux系统定制
自从在大学知道了Linux这玩意是可以定制的之后,一直想做出一版属于自己的Linux系统.最近工作比较闲,终于塌下心来好好学习了一下. 目前来说,我接触的定制Linux的方法主要有两种: 1. ...
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- What Your Computer Does While You Wait
转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本 ...
- 嵌入式linux
嵌入式开发 1.1开发板和宿主机的连接方法:cable 电缆可以通过 串口 网络 以及 JTGA等连接方式. JTAG:国际标准测试协议对芯片内部测试对flash烧写.注意JTAG 是一种协议,具体去 ...