//Pormise
function MyPromise (executor) {
var self = this
self.status = 'pending'
self.resolveValue = null
self.rejectValue = null
self.resolveCallbackList = [] //用来存储resolve的回调函数
self.rejectCallbackList = [] //用来存储reject的回调函数 function resolve (value) {
if (self.status === 'pending') {
self.status = 'Fulfilled'
self.resolveValue = value
self.resolveCallbackList.forEach(function (item) {
item()
})
}
} function reject (value) {
if(self.status === 'pending') {
self.status = 'Rejected'
self.rejectValue = value
self.rejectCallbackList.forEach(function (item) {
item()
})
}
}
try {
executor(resolve, reject)
} catch (e) {
reject(e)
}
}
function resultIsPromise (nextValue, res, rej) {
if(nextValue instanceof MyPromise) {
nextValue.then(function (val) {
res(val)
}, function(reason) {
rej(reason)
})
} else {
res(nextValue)
}
}
MyPromise.prototype.then = function (resolve, reject) {
if (!resolve) {
resolve = function(val) {
return val
}
}
if (!reject) {
reject = function (val) {
throw new Error(val)
}
}
var self = this
var nextPromise = new MyPromise(function(res, rej) {
setTimeout(function() {
if (self.status === 'Fulfilled') {
try{
// var newResolveVal = resolve(self.resolveValue)
// res(newResolveVal)
var newResolveVal = resolve(self.resolveValue)
resultIsPromise(newResolveVal, res, rej)
} catch(e) {
rej(e)
}
}
}, 0) setTimeout(function () {
if (self.status === 'Rejected') {
try{
var newRejectVal = reject(self.rejectValue)
resultIsPromise(newRejectVal, res, rej)
} catch(e) {
rej(e)
}
}
}, 0) if (self.status === 'pending') {
if(typeof resolve === 'function') {
self.resolveCallbackList.push(function () {
setTimeout(function() {
try{
var newResolveVal = resolve(self.resolveValue)
resultIsPromise(newResolveVal, res, rej)
} catch (e) {
rej(e)
}
})
})
}
if(typeof reject === 'function') {
setTimeout(function () {
self.rejectCallbackList.push(function () {
try{
var newRejectVal = reject(self.rejectValue)
resultIsPromise(newRejectVal, res, rej)
} catch(e) {
rej(e)
}
})
}, 0)
}
}
})
return nextPromise
}
//race
MyPromise.race = function (promises) {
return new MyPromise(function (res, rej) {
promises.forEach( function (item) {
item.then(res, rej)
})
})
}
MyPromise.resolve = function (val) {
return new MyPromise(function (resolve) {
resolve(val)
})
}
MyPromise.catch = function (val) {
return new MyPromise(function (undefined,reject) {
reject(val)
})
}
MyPromise.all = function (promises) {
return new MyPromise(function(resolve, reject){
var countNum=0;
var promiseNum=promises.length;
var resolvedValue=[];
for(var i=0;i<promiseNum;i++){
(function(i){
promises[i].then(function(value){
countNum++;
resolvedValue[i]=value;
if(countNum===promiseNum){
return resolve(resolvedValue)
}
},function(reason){
return reject(reason)
})
})(i)
}
})
}
 
 

Pormise的更多相关文章

  1. pormise和async

    pormise 1.异步问题 假设现在我刚认识你,需要和你说话,但是我普通话不够标准,需要间隔一秒钟才能说一句话,以此让你可以慢慢思考.这样的话我们就需要用到定时器. 最沙雕的代码如下: setTim ...

  2. ES6深入学习记录(二)promise对象相关

    1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...

  3. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  4. js的Promise学习笔记(1)

    1: 何为Promise Promise是抽象异步处理对象以及对其对象进行各种操作的组件,是基于并列/并行处理设计的一种编程语言. 说到基于JavaScript的异步处理,大多数都会想到利用回调函数. ...

  5. JS魔法堂:剖析源码理解Promises/A规范

    一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...

  6. 微信小程序全面实战,架构设计 && 躲坑攻略(小程序入门捷径教程)

    最近集中开发了两款微信小程序,分别是好奇心日历(每天一条辞典+一个小投票)和好奇心日报(轻量版),直接上图: Paste_Image.png 本文将结合具体的实战经验,主要介绍微信小程序的基础知识.开 ...

  7. fetch API

    一.什么是fetch? fetch的作用类似于XMLHttpRequet的作用,用于异步请求网络,其提供的API更加的完善. fetch提供了Request和Response对象的定义,用于自定义网络 ...

  8. Promise 让异步更优

    每个异步方法都返回一个Promise 更优雅. then方法 每一个Promise  都有一个叫then 的方法, 接受一对callback    被解决时调用,resolve, 被拒绝   reje ...

  9. iOS 如何优雅的处理“回调地狱Callback hell”(一) (上)

    前言 最近看了一些Swift关于封装异步操作过程的文章,比如RxSwift,RAC等等,因为回调地狱我自己也写过,很有感触,于是就翻出了Promise来研究学习一下.现将自己的一些收获分享一下,有错误 ...

随机推荐

  1. 11.全局变量(static)

    1.数组 数组名是常量 2. 指针数组 4.局部变量 (1).作用域 作用的范围: (2).普通局部变量 在{}内定义: 只有执行到定义变量的这个语句,系统才会给这个变量分配空间. 当离开{},这个非 ...

  2. 解决webpack打包报错: Cannot find module '@webassemblyjs/wasm-parser'

    出现这个错误时,百度和谷歌中都搜索不出个所以然出来,后来看了一下webpack官网,说建议安装node最新版本: 前提条件 在开始之前,请确保安装了 Node.js 的最新版本.使用 Node.js ...

  3. 运维面试题之linux编程

    吐槽: linux下的编程基本上都很简单包括shell 三剑客和vim的使用,也可能写ansible的playbook,有基础都是一两天可以学会的,正则表达式都是试出来的不知道有些面试官让我们在纸上写 ...

  4. 10个Python基础练习项目,你可能不会想到练手教程还这么有趣

    美国20世纪最重要的实用主义哲学家约翰·杜威提出一个学习方法,叫做:Learning By Doing,在实践中精进.胡适.陶行知.张伯苓.蒋梦麟等都曾是他的学生,杜威的哲学也影响了蔡元培.晏阳初等人 ...

  5. ubuntu 16.04 搭建tigervnc

    主要参考 https://vitux.com/ubuntu-vnc-server/ apt install xfce4 xfce4-goodies -yapt install -y tightvncs ...

  6. html 类似雷达扫描效果 及 闪屏效果

    //雷达扫描效果 1 <em id="Radar" class="RadarFast"></em> css: .RadarFast{ p ...

  7. VS2008生成解决方案卡顿、龟速

    1.工具-选项-项目和解决方案-MS BUILD 项目生成输出详细信息中选择“诊断” 2.进入.NET环境的安装位置:C:\WINDOWS\Microsoft.NET\Framework\v3.5 , ...

  8. 利用Openssh后门 劫持root密码

    Linux操作系统的密码较难获取.而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下, 可以通过修改或者更新OpenSSH代码等方法,截取并保存其SSH登录账号密码,甚至可以 ...

  9. 用一句sql语句更新两个表并可更新对应的字段的值

    ACCESS 例子: insert into products (ProNumber,CASNumber,Cnname,Price,Enname,Baozhuang,Pinpai) select Pr ...

  10. POJ滑雪

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 97172   Accepted: 36843 Description ...