尽管Promise已经有自己的规范,但目前的各类Promise库,在Promise的实现细节上是有差异的,部分API甚至在意义上完全不同。但Promise的核心内容,是相通的,它就是then方法。在相关术语中,promise指的就是一个有then方法,且该方法能触发特定行为的对象或函数。
Promise可以有不同的实现方式,因此Promise核心说明并不会讨论任何具体的实现代码。
先阅读Promise核心说明的意思是:看,这就是需要写出来的结果,请参照这个结果想一想怎么用代码写出来吧。
起步:用这一种方式理解Promise
回想一下Promise解决的是什么问题?回调。例如,函数doMission1()代表第一件事情,现在,我们想要在这件事情完成后,再做下一件事情doMission2(),应该怎么做呢?
先看看我们常见的回调模式。doMission1()说:“你要这么做的话,就把doMission2()交给我,我在结束后帮你调用。”所以会是:
Promise模式又是如何呢?你对doMission1()说:“不行,控制权要在我这里。你应该改变一下,你先返回一个特别的东西给我,然后我来用这个东西安排下一件事。”这个特别的东西就是Promise,这会变成这样:
可以看出,Promise将回调模式的主从关系调换了一个位置(翻身做主人!),多个事件的流程关系,就可以这样集中到主干道上(而不是分散在各个事件函数之内)。
好了,如何做这样一个转换呢?从最简单的情况来吧,假定doMission1()的代码是:
那么,它可以改变一下,变成这样:
这就完成了转换。虽然并不是实际有用的转换,但到这里,其实已经触及了Promise最为重要的实现要点,即Promise将返回值转换为带then方法的对象。
进阶:Q的设计路程
从defer开始
design/q0.js是Q初步成型的第一步。它创建了一个名为defer的工具函数,用于创建Promise:
- var defer = function () {
- var pending = [], value;
- return {
- resolve: function (_value) {
- value = _value;
- for (var i = 0, ii = pending.length; i < ii; i++) {
- var callback = pending[i];
- callback(value);
- }
- pending = undefined;
- },
- then: function (callback) {
- if (pending) {
- pending.push(callback);
- } else {
- callback(value);
- }
- }
- }
- };
新闻热点
疑难解答
图片精选