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还是需要花一番精力去学习和实践的,本文将通过介 ...
随机推荐
- Mysql备份与还原实例
一.备份数据库 ----清空一下日志 mysql> reset master; Query OK, rows affected (0.02 sec) ----查看一下echo表的存储引擎 mys ...
- Eclipse如何设置字体
Eclipse 是一个开放源代码的.基于Java的可扩展开发平台,是学习java和开发java最常用的IDE之一.有时候会遇到这种情况,刚刚下载了新的Eclipse,字体显示英文没问题,但是显示中文就 ...
- ds.Merge 与 ds.Tables[0].Merge 的用法
DataSet ds = new DataSet(); SqlConnection conn = new SqlConnection(ConnectionStr); SqlCom ...
- SharePoint自动化系列——Add/Remove “Hold” from items
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 问题1: 1.如果SharePoint item被添加了hold,通过UI界面来对SharePoi ...
- Mac OS下应用Python+Selenium实现web自动化测试
在Mac环境下的自动化测试环境搭建这里有一篇亲测通过的文<mac下怎么搭建selenium python环境?>. 不过在这个过程中要注意两点: 1.在终端联网执行命令“sudo pip ...
- 移动平台前端开发之WebApp代码技巧
1.首先我们来看看webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用 <meta content="width=device-width ...
- Codeforces Round #372 (Div. 2) B
Description ZS the Coder loves to read the dictionary. He thinks that a word is nice if there exists ...
- 炮(cannon)
炮(cannon)[题目描述] 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称“炮打隔子”. 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...
- ocruntime
原作: http://www.jianshu.com/p/25a319aee33d 三种方法的选择 Runtime提供三种方式来将原来的方法实现代替掉,那该怎样选择它们呢? Method Resolu ...
- 【Java】如何调用系统命令
如何通过Java调用系统命令,如ping 127.0.0.1.java -version等? > 简单的例子 package com.nicchagil.callpython.No001无参数调 ...