[关闭]
@kexinWeb 2017-02-17T23:29:28.000000Z 字数 1394 阅读 1114

对promise对象的简单理解

promise


同步与异步

Javascript 语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。

1.“同步模式”就是传统做法,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的这往往用于一些简单的、快速的、不涉及 IO 读写的操作。

2.“异步模式”则完全不同,每一个任务分成两段,第一段代码包含对外部数据的请求,第二段代码被写成一个回调函数,包含了对外部数据的处理。第一段代码执行完,不是立刻执行第二段代码,而是将程序的执行权交给第二个任务。等到外部数据返回了,再由系统通知执行第二段代码。所以,程序的执行顺序与任务的排列顺序是不一致的、异步的。[1]

为什么要用回调函数

在js编程中,容易受到任务排列顺序的影响,没有注意到js“异步编程”的思想,导致容易出现bug。所以,对于有先后顺序才能执行的(一般是有IO操作)的任务,在js编程中最好使用回调函数的写法。其他无先后顺序要求的代码块位置可以随意摆放。注意:在js中代码顺序不是很重要!

回调函数的核心用处就是:把异步的操作同步化

promise对象的出现

一般回调函数写起来比较麻烦,若有多重回调,嵌套层次太多,导致代码容易出错难维护,所以promise对象就是用来处理这样的问题的。
promise方法封装了冗长易错的回调方法代码,它实际就像一般框架一样,封装好底层代码,暴露出简单易用的接口,进一步解放程序员的工作,减少代码量。

关于resolve和reject

每个异步任务都会返回一个promise对象,这个对象只有三种状态:

  • 异步操作未完成“pending”
  • 异步操作已完成“resolve”
  • 异步操作失败“reject”
  1. var promise = new Promise(function(resolve, reject) {
  2. // 异步操作的代码
  3. if (/* 异步操作成功 */){
  4. resolve(value);
  5. } else {
  6. reject(error);
  7. }
  8. });

每个异步任务只有两种结果

  • 异步操作成功,promise对象抛出resolved
  • 异步操作失败,promise对象抛出rejected

根据promise对象抛出的信息,可以判断之后的回调函数要不要执行。

在上面的代码,如果异步操作成功,则用resolve方法保存数据,向下传递。也就是说,你可以把它看成向下一个回调方法传参,参数为value。也可以把它看成一个函数的处理结果的保存,value作为函数的返回值return给外部。

回调then方法

  1. (new Promise(step1))
  2. .then(step2)
  3. .then(step3)
  4. .then(step4);

总而言之,任何编程思想都是以减少程序员工作量为目的的,理清楚它出现的意图,它可以用来更好的解决什么问题,是学好一个知识的好方法。

参考链接
[1]阮一峰:http://javascript.ruanyifeng.com/advanced/promise.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注