GithubHelp home page GithubHelp logo

liuyunzhuge / a-promise Goto Github PK

View Code? Open in Web Editor NEW
4.0 2.0 0.0 11 KB

非常简单的promise实现,核心源码100多行,清晰易懂,适合学习;不需要在生产环境中使用,Promise都已经是规范了,哪还需要自己去写;实现思路参考自then/promise。

JavaScript 100.00%

a-promise's Introduction

a-promise

非常简单的promise实现,核心源码100多行,清晰易懂,适合学习;不需要在生产环境中使用,Promise都已经是规范了,哪还需要自己去写;实现思路参考自then/promise。

说明

这是一个学习和总结性的项目。实现思路基本上跟then/promise是一致的,不过在它的基础之上,我按照自己的编程风格、命名习惯、组织方式做了调整,以便对Promise实现感兴趣的人,可以从我的这份代码里,花更少的时间来加强自己对Promise的理解。

当初在看到then/promise的源码时,我并没有能够很快速地就能了解它的实现的各个细节,即使在它的代码也非常简短的情况下;经过一段时间琢磨,我发现then/promise的作者比较注重代码的简洁性,而弱化了代码的语义和可阅读性,所以我打算按照自己对它的理解,重新写一下,一来加强自己对Promise的认知,二来也可以记录在此,让更多人有机会学习到这个很有价值的实现方式。想想看,假如在求职的过程中,面试官要求你手写Promise的实现方式,那这个项目所分享的思路,正好帮你做这种特殊场景的准备。

Promise应该被看做一种编程**,它的使用范围远不止于javascript环境,其它语言环境,比如android,object-c,swift也都可以使用这个模式来做异步任务。当你有机会做前端之外的语言时,可以去试试自己在前端所学到的Promise。

源码

核心源码只有两个文件:

  • src/core.js
  • src/static.js

src/core.js提供了以下实现:

  • Promise构造函数
  • Promise.prototype.then这个原型方法
  • Promise.prototype.catch这个原型方法
  • Promise.prototype.finally这个原型方法

scr/static.js提供了以下实现:

  • Promise.resolve这个静态方法
  • Promise.reject这个静态方法
  • Promise.all这个静态方法
  • Promise.race这个静态方法

注意 core.js里面handleDeferred这个方法提到应该把setTimeout替换为asap的方式,我的代码里没有替换,因为毕竟只是个学习的项目;之所以要替换的原因,是按照Promise规范,Promise实例添加的回调函数应该是在要本次事件循环(event-loop)的末尾、下次事件循环前执行的,asap这个库(当然还有别的库)可以帮你做到这一点,而setTimeout开启的定时器会在下一次事件循环开始时才会执行。

core.js里面finishPromise方法加了一个console.error的打印处理,这个只有在一个Promise实例没有添加任何回调,而且状态为rejected时才会执行,防止因为Promise吞并错误,导致使用Promise的人看不到rejected的相关原因。

测试

npm install

node server

打开http://localhost:8080/examples/01.html。这些demo都算是测试用例,需要在控制台里面查看运行结果。

examples/里面写的测试用例,都是在开发过程中用的,不是专门用来做这个项目的覆盖测试的。这个项目的目的是学习,假如你对Promise特性非常熟悉的情况下,可以根据自己的想法,写用例来测试这个项目提供的Promise实现。

a-promise's People

Contributors

liuyunzhuge avatar

Stargazers

Zilmill avatar 1dao avatar 啊喔额 avatar Russ Zhong avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.