实现之前,我们先看看Promise的调用

const src = 'https://img-ph-mirror.nosdn.127.net/sLP6rNBbQhy0OXFNYD9XIA==/799107458981776900.jpg?imageView&thumbnail=223x125&quality=100'

const promise = new Promise(function (resovle, reject) {
var img = document.createElement('img')
img.onload = function () {
resovle(img)
} img.onerror = function () {
reject()
} img.src = src
}) promise.then(function (img) {
console.log(img.width)
}, function () {
console.log('错误')
}).then(function (img) {
console.log(img.height)
document.body.appendChild(img)
})

下面我们一边分析,一边实现自己的promise。

首先Promise是一个构造方法,并且初始化的时候传入了一个函数作为参数

var MyPromise = function (doSomething) {
this.doSomething = doSomething
}

then方法很明显可以看出是Promise的实例方法,并且可以实现链式调用,说明在then方法中返回了Promise实例,即this

MyPromise.prototype.after = function (resovle, reject) {
this.doSomething(resovle, reject)
return this
}

此处的after方法相当于then方法。那么MyPromise的简易版就完成了。他的调用方法和示例的调用是一样的。

const src = 'https://img-ph-mirror.nosdn.127.net/sLP6rNBbQhy0OXFNYD9XIA==/799107458981776900.jpg?imageView&thumbnail=223x125&quality=100'

const mypromise = new MyPromise(function (resovle, reject) {
var img = document.createElement('img')
img.onload = function () {
resovle(img)
} img.onerror = function () {
reject()
} img.src = src
}) mypromise.after(function (img) {
console.log(img.width)
}, function () {
console.log('错误')
}).after(function (img) {
console.log(img.height)
document.body.appendChild(img)
})

后记:相比Promise,这个实现过于简单,功能上简直不值一提。仅仅抛砖引玉。

最新文章

  1. 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
  2. sqlite3的图片的(二进制数据)存取操作
  3. (转) Xcode 7 Bitcode
  4. xss绕过过滤之方法
  5. shell从函数文件里调用函数
  6. 无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) 解决方案
  7. Problem 2128 最长子串(kmp+strstr好题经典)
  8. newinstance()和new有什么区别?(转)
  9. 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值
  10. 支持向量机(Support Vector Machine)-----SVM之SMO算法(转)
  11. linux常用命令及使用技巧(一)
  12. consul & registrator & consul-template 使用
  13. [android] 代码注册广播接收者&利用广播调用服务的方法
  14. pycharm下打开、执行并调试scrapy爬虫程序
  15. position和float小结
  16. 【Oracle】Oracle基本数据类型总结
  17. linux 安装 mysql-5.6.26
  18. 加载 bean*.xml
  19. CentOS7安装virtualbox
  20. PostgreSQL资料汇总

热门文章

  1. Vue图片验证码-自定义组件高级版
  2. python全栈学习 day03
  3. linux基础之IO模型
  4. linux查看防火墙状态和对外开放的端口状态
  5. ASP.NET MVC5----数据注解和验证
  6. 【巨杉数据库SequoiaDB】为“战疫” 保驾护航,巨杉在行动
  7. word的一些运用技巧
  8. 【PHP】使用PHP抓取Bing每日图像并为己所用
  9. 通过设置iis在局域网中访问网页
  10. 在 React 中使用 Typescript