Pormise
//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的更多相关文章
- pormise和async
pormise 1.异步问题 假设现在我刚认识你,需要和你说话,但是我普通话不够标准,需要间隔一秒钟才能说一句话,以此让你可以慢慢思考.这样的话我们就需要用到定时器. 最沙雕的代码如下: setTim ...
- ES6深入学习记录(二)promise对象相关
1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...
- 大白话讲解Promise(二)理解Promise规范
上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...
- js的Promise学习笔记(1)
1: 何为Promise Promise是抽象异步处理对象以及对其对象进行各种操作的组件,是基于并列/并行处理设计的一种编程语言. 说到基于JavaScript的异步处理,大多数都会想到利用回调函数. ...
- JS魔法堂:剖析源码理解Promises/A规范
一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...
- 微信小程序全面实战,架构设计 && 躲坑攻略(小程序入门捷径教程)
最近集中开发了两款微信小程序,分别是好奇心日历(每天一条辞典+一个小投票)和好奇心日报(轻量版),直接上图: Paste_Image.png 本文将结合具体的实战经验,主要介绍微信小程序的基础知识.开 ...
- fetch API
一.什么是fetch? fetch的作用类似于XMLHttpRequet的作用,用于异步请求网络,其提供的API更加的完善. fetch提供了Request和Response对象的定义,用于自定义网络 ...
- Promise 让异步更优
每个异步方法都返回一个Promise 更优雅. then方法 每一个Promise 都有一个叫then 的方法, 接受一对callback 被解决时调用,resolve, 被拒绝 reje ...
- iOS 如何优雅的处理“回调地狱Callback hell”(一) (上)
前言 最近看了一些Swift关于封装异步操作过程的文章,比如RxSwift,RAC等等,因为回调地狱我自己也写过,很有感触,于是就翻出了Promise来研究学习一下.现将自己的一些收获分享一下,有错误 ...
随机推荐
- 多线程之Synchronized锁的基本介绍
基本介绍 synchronized是Java实现同步的一种机制,它属于Java中关键字,是一种jvm级别的锁.synchronized锁的创建和释放是此关键字控制的代码的开始和结束位置,锁是有jvm控 ...
- 彻底清空SharePoint回收站(仅限IE)
1.导航到回收站页面2.F12,在控制台输入javascript:emptyItems()3.回车 4.点击确定即可 注意:这种方法可能只适用于Internet Explorer
- mac OSx 安装 mysqlclient
首先需要安装 按照提示操作 brew install mysql-connector-c 然后 修改mysql_config 执行mysql_config可以看到文件所在位置 我的目录放在 /usr ...
- python使用telnetlib
python使用telnetlib 1 前言 目前,本篇仅记录前段时间搜索得到的关于python使用Telnet的技术博客,由于受领新任务,未进一步验证和深入研究与应用. 参考链接: python官网 ...
- (转)jmeter接口测试--获取token
Jmeter进行接口测试-提取token 项目一般都需要进行登陆才能进行后续的操作,登陆有时发送的请求会带有token,因此, 需要使用后置处理器中的正则表达式提取token,然后用BeanShell ...
- Nuxt 自动化部署及打包后文件自动上传七牛云
1.安装七牛云 2.在项目根目录新建 upload.js 3.上传凭证 4.上传配置,详情参考七牛云文档 5.在 package.js中修改项目build完成执行upload文件命令 7. nuxt. ...
- java生成条形码工具类
package com.runtime.extend.utils.CodeCreate;import java.awt.Color;import java.awt.Font;import java.a ...
- 小程序wx:for Do not set same key \"NaN\" in wx:key.
在使用wx:for的时候出现了Do not set same key \"NaN\" in wx:key. 去网上查看资料,说是使用wx:key 试了一下,没用 字面意思是不要设置 ...
- JavaScript之jsx&react
1.Virtual DOM 1.将网页所有内容映射到一颗树形结构的层级对象模型上,浏览器提供对dom的支持,用户可以是用脚本调用dom,api来动态修改dom节点,从而达到修改网页目的,这种修改是浏览 ...
- 【数据结构】算法 LinkList (Remove Nth Node From End of List)
删除链表中倒数第n个节点 时间复杂度要控制在O(n)Solution:设置2个指针,一个用于确定删除节点的位置,一个用于计算倒数间距n.移动时保持2个指针同时移动. public ListNode r ...