首页 > 语言 > JavaScript > 正文

JavaScript编程中的Promise使用大全

2024-05-06 16:23:56
字体:
来源:转载
供稿:网友
这篇文章主要介绍了JavaScript中的Promise使用详解,promise对象是JS进阶学习中的重要知识点,需要了解的朋友可以参考下
 

尽管Promise已经有自己的规范,但目前的各类Promise库,在Promise的实现细节上是有差异的,部分API甚至在意义上完全不同。但Promise的核心内容,是相通的,它就是then方法。在相关术语中,promise指的就是一个有then方法,且该方法能触发特定行为的对象或函数。

Promise可以有不同的实现方式,因此Promise核心说明并不会讨论任何具体的实现代码。

先阅读Promise核心说明的意思是:看,这就是需要写出来的结果,请参照这个结果想一想怎么用代码写出来吧。

起步:用这一种方式理解Promise

回想一下Promise解决的是什么问题?回调。例如,函数doMission1()代表第一件事情,现在,我们想要在这件事情完成后,再做下一件事情doMission2(),应该怎么做呢?

先看看我们常见的回调模式。doMission1()说:“你要这么做的话,就把doMission2()交给我,我在结束后帮你调用。”所以会是:

 

复制代码代码如下:
doMission1(doMission2);

 

Promise模式又是如何呢?你对doMission1()说:“不行,控制权要在我这里。你应该改变一下,你先返回一个特别的东西给我,然后我来用这个东西安排下一件事。”这个特别的东西就是Promise,这会变成这样:

 

复制代码代码如下:
doMission1().then(doMission2);
 

 

可以看出,Promise将回调模式的主从关系调换了一个位置(翻身做主人!),多个事件的流程关系,就可以这样集中到主干道上(而不是分散在各个事件函数之内)。

好了,如何做这样一个转换呢?从最简单的情况来吧,假定doMission1()的代码是:

 

复制代码代码如下:
function doMission1(callback){  
  var value = 1;  
  callback(value);  
}

 

那么,它可以改变一下,变成这样:

 

复制代码代码如下:
function doMission1(){  
  return {  
    then: function(callback){  
      var value = 1;  
      callback(value);  
    }  
  };  
}
 

 

这就完成了转换。虽然并不是实际有用的转换,但到这里,其实已经触及了Promise最为重要的实现要点,即Promise将返回值转换为带then方法的对象。

进阶:Q的设计路程

从defer开始

design/q0.js是Q初步成型的第一步。它创建了一个名为defer的工具函数,用于创建Promise:
 

  1. var defer = function () {  
  2.  var pending = [], value;  
  3.  return {  
  4.  resolve: function (_value) {  
  5.   value = _value;  
  6.   for (var i = 0, ii = pending.length; i < ii; i++) {  
  7.   var callback = pending[i];  
  8.   callback(value);  
  9.   }  
  10.   pending = undefined;  
  11.  },  
  12.  then: function (callback) {  
  13.   if (pending) {  
  14.   pending.push(callback);  
  15.   } else {  
  16.   callback(value);  
  17.   }  
  18.  }  
  19.  }  
  20. }; 
?
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表