博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pormise
阅读量:6288 次
发布时间:2019-06-22

本文共 4442 字,大约阅读时间需要 14 分钟。

//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
 
 

 

转载于:https://www.cnblogs.com/CoderZX/p/10792216.html

你可能感兴趣的文章
angularjs入门(一)
查看>>
环境变量PATH、cp命令、mv命令、cat命令、tac命令、more、less、head、tail
查看>>
bandit系列0--10
查看>>
文本过滤之grep,egreo及fgrep 三剑客及正则表达式
查看>>
实现Singleton模式在C#
查看>>
服务发现:Zookeeper vs etcd vs Consul
查看>>
微软企业项目管理系统技术研讨会
查看>>
Kafka设计篇之消息传输的事务定义
查看>>
我的友情链接
查看>>
使用windows 7 系统安装盘 DOS普通用户提权为管理员
查看>>
老男孩教育每日一题第115天:如何在centos 6下面实现命令补全?效果如下
查看>>
国内可用的yum源
查看>>
linux df -h 命令卡住 解决方法
查看>>
spring是什么,Spring能帮我们做什么
查看>>
Codeforces 861D - Polycarp's phone book
查看>>
FreePortScanner.java
查看>>
HttpURLConnection 文件上传限制
查看>>
javascript类式继承新的尝试
查看>>
真正掌握vuex的使用方法(四)
查看>>
MySql的Communications link failure解决办法
查看>>