开发
终于有时间写这篇文章了, ES2015 推出了JS 的 Promise ,而在没有原生支持的时候,我们也可以使用诸如 Promises/A+ 的库的帮助,在我们的代码里实现Promise 的支持;
如何使用 Promise
在讲具体实现之前我们还是先了解下我们如何使用 Promise 在我们的代码中。
function getData() { return new Promise((resolve, reject)=>{ request( your_url, (error, res, movieData)=>{ if (error) reject(error); else resolve(movieData); }); }); } // 使用 getData getData().then(data => console.log(data)) .catch(error => console.log(error));
例子我们需要使用 request 模块去请求一个地址,然后拿到响应的数据。由于 request 过程是一个异步的过程。因此我们使用了 promise 来实现。在使用 promsie 的 then 方法拿到 resolve 回来的的数据。
开始基本实现
首先我们定义一个基本的 Promise 类,为了区别于原生的 Promise 我们可以自定义一个 JPromise 类。
function Promise(fn) { var callback = null; this.then = function(cb) { callback = cb; }; function resolve(value) { callback(value); } fn(resolve); }
那这样我们实现一个基本的异步过程函数。
function doSomething() { return new Promise(function(resolve) { var value = 42; resolve(value); }); }
但是这样写法有一个问题就是你会发现他在 resolve()
会在 then
之前调用。意味着 callback 会是 null .暂时我们用 setTimeout 来 hack 这个问题。
function Promise(fn) { var callback = null; this.then = function(cb) { callback = cb; }; function resolve(value) { setTimeout(function() { callback(value); }, 1); } fn(resolve); }
再进一步,我们需要 Promise 有状态。
扩展阅读
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。