简单的实现了一个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 规范的一个简单的浏览器端实现的更多相关文章

  1. Pyqt 一个简单的浏览器

    使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ...

  2. 【Java】 实现一个简单文件浏览器(1)

    学习Java的Swing的时候写的一个超简单文件浏览器 效果如图: 项目结构: 这里面主要用了两个控件,JTree和JTable 下面先说下左侧的文件树如何实现: 首先是FileTree类,继承于JT ...

  3. SeaJS:一个适用于 Web 浏览器端的模块加载器

    什么是SeaJS?SeaJS是一款适用于Web浏览器端的模块加载器,它同时又与Node兼容.在SeaJS的世界里,一个文件就是一个模块,所有模块都遵循CMD(Common Module Definit ...

  4. 【Java】 实现一个简单文件浏览器(2)

    接着上篇文章 接下来说下程序右侧的文件内容表格如何实现 FileTable类: FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为FileT ...

  5. 遵循amd规范的require.js(适合浏览器端)

    1. 下载require.js 2. 引用 html <!DOCTYPE html> <html lang="en"> <head> <m ...

  6. 一个简单的 PC端与移动端的适配(通过UA)

    只需在header引用个js文件, 原理就是判断UA里面的标识.  加下面代码添加到js文件,在头文件引用即可 var Pc_url = 'http://www.baidu.com'; //PC端网址 ...

  7. 从零开始搭建一个简单的基于webpack的vue开发环境

    原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...

  8. django写一个简单的登陆注册

    要写这个,前提还是需要知道三个知识: 一个是urls.py,它是写我们的路由关系的,之前我写了通过wsgiref写一个简单的服务端,也用到了路由,就是 请求过来的url和视图函数的对应关系. 二是就是 ...

  9. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

随机推荐

  1. 高级工具gprof、gprof2dot.py、dot

    可以研究程序性能.函数调用堆栈等,而且能用图标查看. linux环境下 C++性能测试工具 gprof + kprof + gprof2dot - 阁子 - 博客园 gprof.gprof2dot.p ...

  2. session 加入redis的实现代码方式

    session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们可以看到这样的话&quo ...

  3. 快速稳定的维护PHP

    Just to recap, previously we'd have this sort of thing: namespace me\adamcameron\testApp; use Guzzle ...

  4. linux crontab定时执行

    #利用crontab定时执行url研究了两种简单方式#一利用lynx访问url yum install lynxservice crond startcrontab -einsert键* * * * ...

  5. hdwiki 的模板和标签

    模版和标签 HDWiki模版标签可以让用户更方便.更容易的在页面中调用HDWiki的数据.        HDWiki的三种标签:1.循环标签 {hdwiki:doclist...}{/hdwiki} ...

  6. day3 python 集合 文件

    字典是无序的,列表是有序的 a='zhangsan' print (a[1]) a[2]=222 #字符串不能赋值 集合(set):把不同的元素组成一起形成集合 info=[1,2,34,5,6,7] ...

  7. Drainage Ditches 分类: POJ 图论 2015-07-29 15:01 7人阅读 评论(0) 收藏

    Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62016 Accepted: 23808 De ...

  8. PowerShell调用jira rest api实现jira统计自动化

    通过调用JIRA Rest web api实现统计自动化,首先进行登录模拟: $content = @{username='用户名';password='密码'} $JSON=$content|con ...

  9. Javascript中setTimeout()的用法详解

    1.SetTimeOut()       1.1 SetTimeOut()语法例子       1.2 用SetTimeOut()执行Function       1.3 SetTimeout()语法 ...

  10. 数的n次方 s.match(reg) marquee滚动效果

    一.数的n次方 <script> alert(math.pow(a,5)); /*输出a的5次方*/ </script> 二. s.match(reg); s代表一个字符串,r ...