最近一下班就没有持续学习,已经持续了几个月,回家就是练练字,看看书,干些七七八八的事。这样的生活总感觉空落落的,毕业半年了,总感觉自己很多东西明白的不清不楚,希望接下来的每一天都能扎扎实实学好。
为了让自己有个好的思路来总结,就按着这个顺序来描述
一、出现前景,Promise是什么
二、基本使用规则
一、出现前景,Promise是什么
出现前景:
在一个单线程的世界,为了支持异步编程,于是Js使用了回调,然而回调带来的问题就是我们经常听到的什么地狱回调,金字塔等问题。有问题就会有解决方案,所以就出现了Promise。
Promise是什么:
作为es6新增的功能之一,网上教程对它的描述是:一个容器, 里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,一种通过使代码看起来同步并避免在回调时出现问题进而大大简化异步编程的模式。
二、基本使用规则
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例
const promise = new Promise(function(resolve, reject) { if (操作成功){ resolve(value); } else { reject(error); } });
从上面代码可以看到Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,此外这两个参数是连两个函数,由JS引擎提供。
那么这两个函数的作用是:
(1) resolve: 将Promise对象的状态从未完成变成成功,异步操作成功时调用。
(2) reject: 将Promise对象的状态从未完成变成失败,异步操作失败时调用。
当Promise实例生成后,就可以用then方法指定resolve状态和reject状态的回调函数
then方法接受两个回调函数作为参数: 第一个回调是当Promise对象的状态为resolve时调用
第二个回调函数是当Promise对象的状态为reject时调用,第二个回调函数可选
下面是一个从网上教程看的基本案例:
var promise = new Promise(function(resolve, reject) { resolve() console.log('我是当前脚本的同步任务,then方法指定的回调函数等下我,你的在我后面排队') }) promise.then(function(resolve) { console.log('promise的状态为resolve,所以我被调用出来啦') },function(reject) { console.log('promise的状态为reject,我才会出来哦,这次我就不参与') }) 结果输出: 我是当前脚本的同步任务,then方法指定的回调函数等下我,你的在我后面排队 promise的状态为resolve,所以我被调用出来啦
Promise.prototype.then()
Promise 实例具有then方法, 那么then方法是定义在原型对象promise.prototype上的
then方法返回的也是一个新的Promise实例,因此可以采用链式写法,即then方法后面再调用另一个then方法
run1.then(function(data) { console.log(data + ':第一个输出') return run2(); }).then(function(data) { console.log(data + ':第二个输出') return run3() }).then(function(data) { console.log(data + ':第三个输出') })
上面的代码使用then
方法,第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。
Promise.prototype.catch():
用于指定发生错误时的回调函数
run1.then(function(data) {
return run2();
}).catch(function(data) {
console.log('前方有异常')
})
看到这里的时候,可能会觉得promise对象不是有一种失败调用的reject函数么,如下格式:
run1.then(function(data) { return run2(); }, function(data) { console.log('异常调用') })
对比这两种写法,第一种写法要好于第二种写法,理由是通过catch可以捕获前面then
方法执行中的错误,更接近同步的写法(try/catch
)。
因此,建议总是使用catch
方法,而不使用then
方法的第二个参数。