//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. static与volatile的用法

      static 1.概述 static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别 ...

  2. HTML技巧篇:如何让单行文本以及多行文本溢出时显示省略号(…)

    参考:https://baijiahao.baidu.com/s?id=1621362934713048315&wfr=spider&for=pc 本篇文章主要给大家介绍一下在html ...

  3. [ionic3.x开发记录]ng-content使用

    在ionic开发公用组件的时候,我一直在想有没有angular有没有像vue一样的slot插槽.方便组件后期扩展. 然后去翻文档,发现有ng-content这么个东西,用法很像vue的slot. 组件 ...

  4. mysql中的count()函数

    1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数. 2.count()语法: (1)count(*)---包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会 ...

  5. 775. Global and Local Inversions

    We have some permutation A of [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...

  6. btcpool之Stratum协议

    一.简介 矿机(或挖矿软件)与矿池之间通过stratum协议通讯,它包括订阅.授权.下发难度.下发任务.提交share五种消息. 二.订阅(mining.subscribe) 矿机启动后,先和矿池建立 ...

  7. ZY

    2017*****1022:我是石翟夫:我的爱好是计算机: 我的码云个人主页是:https://gitee.com/S_DiF/events 我的第一个项目地址是:https://gitee.com/ ...

  8. Unity 利用UGUI打包图集,动态加载sprite资源

    今天做了一个UI界面,这个界面是好友界面,该界面上有若干个好友item. 需要对每个tem的头像对象(image)动态显示对应的头像.尝试利用UGUI的图集来加载,具体实现如下: 1.首先,需要知道S ...

  9. 5+移动App

    1.5+ App开发入门指南 https://www.cnblogs.com/tuyile006/p/5395909.html 2.5+ App开发Native.js入门指南 http://ask.d ...

  10. Ajax请求二进制流并在页面展示

    后端代码: public void getIntegralQrcode(HttpServletResponse response, String token) throws BizException, ...