es6中promise ALL Race Resolve Reject finish的实现
function mypromise(func){
this.statue = "pending";
this.data = null;
this.resolveCallback = [];
this.rejectCallback = [];
this._final = null;
var self = this;
var resolve = function(data){
if (data instanceof mypromise) {
data.then(resolve,reject)
return;
}
setTimeout(function(){
if(self.statue != "pending") return;
self.data = data;
self.statue = "resolve";
for(var i = 0; i < self.resolveCallback.length; i++){
var item = self.resolveCallback[i];
item.bind(self)(data)
}
},0)
}
var reject = function(data){
setTimeout(function(){
if(self.statue != "pending") return;
self.data = data;
self.statue = "reject";
for(var i = 0; i < self.rejectCallback.length; i++){
var item = self.rejectCallback[i];
item.bind(self)(data)
}
},0)
}
try {
if (typeof func == 'function'){
func.bind(this)(resolve,reject);
}else{
if(func == 'reject'){
this.statue = "reject";
reject();
}else{
this.statue = "resolve";
resolve();
}
}
} catch (e) {
reject(e)
}
}
mypromise.prototype.then = function(onresolve,onreject){
var self = this;
onresolve = typeof onresolve === 'function' ? onresolve : function(data){return data;}
onreject = typeof onreject === 'function' ? onreject : function(data){return data;}
if(self.statue == "pending"){
return new mypromise(function(resolve,reject){
var _this = this;
self.resolveCallback.push(function(data){
var x = onresolve(data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else{
resolve(x)
}
typeof _this._final == 'function' ? _this._final() : null;
}) self.rejectCallback.push(function(data){
var x = onreject(data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else{
reject(x)
}
typeof _this._final == 'function' ? _this._final() : null;
}) });
}
if(self.statue == "resolve"){
return new mypromise(function(resolve,reject){
var x = onresolve(self.data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else {
resolve(x);
}
typeof this._final == 'function' ? this._final() : null;
});
}
if(self.statue == "reject"){
return new mypromise(function(resolve,reject){
var x = onreject(self.data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else {
reject(x);
}
typeof this._final == 'function' ? this._final() : null;
});
}
}
mypromise.prototype.catch = function(reject){
return this.then(null,reject);
} mypromise.All = function(){
var allArguments = arguments;
var len = allArguments.length,
item = null,
successResult = [],
failResult = []
resultData = [];
return new mypromise(function(resolve,reject){
function resolver(index){
return function(data){
successResult.push(1);
resolveAll(index,data);
}
}
function rejecter(index){
return function(data){
failResult.push(1);
resolveAll(index,data);
}
}
function resolveAll(index,data){
resultData.push({index:index,data:data})
if(successResult.length + failResult.length == len){
if( successResult.length == len){
resolve(resultData)
}else{
reject(data)
}
}
}
for(var i = 0; i < len; i++){
item = allArguments[i];
if(!(item instanceof mypromise)){
throw new TypeError("you must pass promise to mypromise.all")
}
item.then(resolver(i),rejecter(i))
}
})
}
mypromise.Race = function(){
var allArguments = arguments;
var len = allArguments.length,
item = null,
successResult = [],
failResult = [];
return new mypromise(function(resolve,reject){
function resolver(data){
successResult.push(1);
resolveAll(data);
}
function rejecter(data){
failResult.push(1);
reject(data);
}
function resolveAll(data){
resolve(data)
}
for(var i = 0; i < len; i++){
item = allArguments[i];
if(!(item instanceof mypromise)){
throw new TypeError("you must pass promise to mypromise.all")
}
item.then(resolver,rejecter)
}
})
}
mypromise.Resolve = function(func){
if(func instanceof mypromise){
return func;
}else{
return new mypromise('resolve');
}
}
mypromise.Reject = function(func){
return new mypromise('reject');
}
mypromise.prototype.Final = function(onresolve){
this._final = onresolve;
}
es6中promise ALL Race Resolve Reject finish的实现的更多相关文章
- 对于ES6中Promise的个人见解
1.js中常见的异步 JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作. let button = document.getElementById("btn&quo ...
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- ES6中promise的使用方法
先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...
- ES6 中 Promise
在说Promise之前我们先简单说一下什么是同步异步? 同步(Sync):所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 异步(Async):异步与同步相对, ...
- ES6中promise总结
一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...
- ES6 中 Promise 详解
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...
- ES6中Promise详解
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 AP ...
- ES6中Promise的入门(结合例子)
一.Promise的前言 解决回调地狱 //以往回调方式 函数1(function(){ //代码执行...(ajax1) 函数2(function(){ //代码执行...(ajax2) 函数3(f ...
- 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) { if (success){ ...
随机推荐
- Selenium Edge Driver Python 自动化测试
Finally I got it. 没有自动化过edge,今天被小坑了一下,但是还好现在弄好了. 1. 查看edge 版本,我的是14.14393 2. https://developer.micro ...
- 最新阿里云申请免费SSL证书实现网站HTTPS化(图文教程一)
一.申请免费SSL证书: 1.登录阿里云: 2.领取代金券礼包: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=0a ...
- 18.12.09-C语言练习:黑洞数 / Kaprekar问题
题目: 程序: #include <stdio.h> int main(void) { int n, a, b, c, t, A, B; printf("输入一个三位数整数:&q ...
- 集合 set
集合 集合属于可变数据类型,但它的内容必须是不可变数据类型. 特点:无序 , 不重复 有两种创建方式: set({1,2,3})和 {1,2,3} set1 = set({1,2,3,4}) s ...
- 从json-lib转成jackson的遇到的问题
从json-lib转成jackson的遇到的问题 问题一:json 字符串,再经过Jackson序列化之后就变成原生字符串了.而json-lib经过再序列化之后,还是json格式的串. 针对这种情况, ...
- vscode小程序代码高亮
vscode无法识别wxml,wxss语法: wxml文件设置: (1)任意打开一wxml文件,点击下方语言模式选择,这里已关联wxm所以当前显示wxml.默认关联为纯文本或者html或其他语法,点击 ...
- android 开发设计模式---Builder模式
我们通过一个例子来引出Builder模式.假设有一个Person类,我们通过该Person类来构建一大批人,这个Person类里有很多属性,最常见的比如name,age,weight,height等等 ...
- ssm框架搭建的基本配置(一站式教会你搭建)
首先是需要的jar包: <dependency> <groupId>org.springframework</groupId> <artifactId> ...
- 为KindEditor 添加“一键去除空格功能”
环境说明:KindEditor 4.1.11 一.确定你在使用KindEditor时,引用的是kindEditor-all.js,找到任何一个已经存在的功能,例如,清除HTML代码,我在做的时候本来 ...
- ltp-ddt nor_mtd_dd_rw_jffs2
nor_mtd_dd_rw_jffs2运行报错 error getting mtd part number: $part get_mtd_biggest_part for $DEVICE_TYPE: ...