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还是需要花一番精力去学习和实践的,本文将通过介 ...
随机推荐
- PHP获取不了React Native Fecth参数的解决办法代码是怎样?
fetch('https://mywebsite.com/endpoint/', { method: 'POST',headers: {'Accept': 'application/json','Co ...
- 约瑟夫问题 java
约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围 ...
- javascript 中==和===的区别
对于JavaScript中比较运算符,可能大家用的比较多的是“==”.对于“===”很多人可能很陌生.=== 表示恒等,首先比较两边的变量数据类型是否相等,其次比较两边的变量的数值是否相等:= ...
- java从命令行接收多个数字,求和之后输出结果
设计思想:获取输入数的个数,然后将要相加的数字转换成为浮点型进行相加,最后进行输出 源代码: package Add; import java.util.Scanner; // 严羽卿 2015. ...
- Winform窗体
Form窗体是Windows应用程序的基本单元.Form窗体不仅是一个窗口,还是一个容器,窗体内可以放置各种控件来实现各种功能.Form窗体也是对象,在窗体类Form中定义了生成窗体的模板,对窗体类进 ...
- Android开发中完全退出程序的三种方法
参考: http://android.tgbus.com/Android/tutorial/201108/363511.shtml Android程序有很多Activity,比如说主窗口A,调用了子窗 ...
- UVa 1339,紫书P73,词频
题目链接:https://uva.onlinejudge.org/external/13/1339.pdf 紫书P73 解题报告: #include <stdio.h> #include ...
- Unix网络编程--卷一:套接字联网API
UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...
- 用WebDriver实现基于jira过滤器视图的统计自动化
在Jira上通过过滤器我们可以做出多种视图,以方便统计我们想要收集的结果.比如:我想查看所有分派给我的任务.在Jira上,我保存了一个过滤器,叫做“分派给我的所有任务”.这个过滤器可以过滤出所有分配给 ...
- linux学习建议
给初学者的建议 注意事项: 1 严格区分大小写,包括命令和文件夹,windows和linux的系统不太一样 2 所有内容都是以文件保存,包括硬件,文件要永久生效,都要写入文件,所以文件命令很重要 3 ...