let promise = new Promise((resolve, reject) =>{ // .... some coding if (true){ // 异步操作成功 resolve(value); } else { reject(error); } }) promise.then(value=>{ // 成功的回调函数 }, error=>{ // 失败后的回调函数 })
let promise = new Promise((resolve, reject) =>{ console.log('开始') if (2 > 1){ // 异步操作成功 resolve({name:'peter',age:25}); } else { reject(error); } }) promise.then(value=>{ // 成功的回调函数 console.log(value) }, error=>{ // 失败后的回调函数 console.log(error) }) // 开始 // {name: "peter", age: 25}
let promise = new Promise((resolve, reject) =>{ console.log('开始') if (2 > 3){ // 异步操作成功 resolve(a); } else { reject('未知错误'); } }) promise.then(value=>{ // 成功的回调函数 console.log(value) }, error=>{ // 失败后的回调函数 console.log(error) }) // 开始 // 未知错误
Promise的特点:
promise先按顺序实行完promise实例中方法再实行then中的resolve或者reject.
let promise = new Promise((resolve, reject)=>{ console.log('promise') if (2 > 1){ // 异步操作成功 resolve({name:'peter',age:25}); } else { reject(error); } console.log('end') }) promise.then( value=>{ console.log(value) }, error=>{ console.log(error) } ) // promise // end // {name: "peter", age: 25}
promise封装Ajax的例子
const getJSON = function (url) { const promise = new Promise(function (resolve, reject) { const handler = function () { if (this.readyState !== 4) { return; } if (this.status === 200) { resolve(this.response); } else { reject(new Error(this.statusText)); } }; const client = new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange = handler; client.responseType = "json"; client.setRequestHeader("Accept", "application/json"); client.send(); }); return promise; }; getJSON("xxxxx").then(function (json) { console.log('Contents: ' + json); }, function (error) { console.error('出错了', error); });
then() 为 Promise 实例添加状态改变时的回调函数 ,上面已经提起过.
function start() { return new Promise((resolve, reject) => { resolve('start'); }); } start() .then(data => { // promise start console.log(data); return Promise.resolve(1); // p1 }) .then(data => { // promise p1 console.log(data); }) // start // 1
promise的链式编程,就是第一个的Promise实例的返回的值作为下一个Promise实例的参数。
catch() 用于指定发生错误时的回调函数 和then一样,存在链式
function start() { return new Promise((resolve, reject) => { resolve('start'); }); } start() .then(data => { // promise start console.log(data); return Promise.reject(1); // p1 }) .catch(data => { // promise p1 console.log(data); })
ps:then方法指定的回调函数,如果运行中抛出错误(reject),也会被catch方法捕获。如果运行中是正确的,则不会实行catch语句,而是then的回调
function start() { return new Promise((resolve, reject) => { if(2>3){ resolve('start'); }else{ reject('error') } }); } start() .then(data => { console.log(data); }) .catch(data => { console.log(data); }) // error
try catch方法等价于promise 抛出错误:
// 写法一 const promise = new Promise(function(resolve, reject) { try { throw new Error('test'); } catch(e) { reject(e); } }); promise.catch(function(error) { console.log(error); }); // 写法二 const promise = new Promise(function(resolve, reject) { reject(new Error('test')); }); promise.catch(function(error) { console.log(error); })
function start() { return new Promise((resolve, reject) => { if(4>3){ resolve('start'); }else{ reject('error') } }); } start() .then(data => { console.log(data); return Promise.resolve(1) }) .catch(data => { console.log(data) }) .then(data => { console.log(data) return Promise.reject(2) }) .catch(data => { console.log(data); }) // start // 1 // 2
finally() 不管promise最后的状态,在执行完then或catch指定的回调函数以后,都会执行finally方法指定的回调函数
function promise(){ return new Promise((resolve, reject) => { resolve('success'); }) }; promise().then(data => { console.log(data) return Promise.reject('fail') }).catch(data =>{ console.log(data) }).finally(() => { console.log('end') }) // success // fail // end
Promise.all() 将多个 Promise 实例,包装成一个新的 Promise 实例。并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调
const allPromise = Promise.all([p1, p2, p3])
function promise(){ return new Promise((resolve, reject) => { console.log(1) resolve('第一个'); }) }; function promise1(){ return new Promise((resolve, reject) => { console.log(2) resolve('第二个'); }) }; function promise2(){ return new Promise((resolve, reject) => { console.log(3) resolve('第三个'); }) }; Promise.all([promise(), promise1(), promise2()]) .then(data => { console.log(data) }) .catch(data => { console.log(data) }) // 1 // 2 // 3 // [1,2,3]
function promise(){ return new Promise((resolve, reject) => { console.log(1) resolve('第一个'); }) }; function promise1(){ return new Promise((resolve, reject) => { console.log(2) reject('第二个'); }) }; function promise2(){ return new Promise((resolve, reject) => { console.log(3) resolve('第三个'); }) }; Promise.all([promise(), promise1(), promise2()]) .then(data => { console.log(data) }) .catch(data => { console.log(data) }) // 1 // 2 // 3 // 第二个
Promise.race() 将多个 Promise 实例,包装成一个新的 Promise 实例。
function promise(){ return new Promise((resolve, reject) => { setTimeout(function(){ console.log(1); resolve('第一个'); }, 4000); }) }; function promise1(){ return new Promise((resolve, reject) => { setTimeout(function(){ console.log(2); resolve('第二个'); }, 2000); }) }; function promise2(){ return new Promise((resolve, reject) => { setTimeout(function(){ console.log(3); resolve('第三个'); }, 3000); }) }; Promise.race([promise(),promise1(), promise2()]) .then(data => { console.log(data) }) .catch(data => { console.log(data) }) // 2 // 第二个 // 1 // 3
Promise.resolve() 返回一个新的Promise实例,并且状态为resolve。
function fn(){ console.log('success') return 1 } Promise.resolve(fn()) .then(data => { console.log(data) }) // success // 1
Promise.reject() 返回一个新的Promise实例,并且状态为reject。
function fn(){ console.log('fail') return 2 } Promise.reject(fn()) .then(data => { console.log(data) }) .catch(data => { console.log(data) }) // fail // 2
有了Promise
对象,就可以把异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise
对象提供了统一的接口,使得控制异步操作更加容易。
对应的笔记和实例,我放到了GitHub,https://github.com/sqh17/notes
有什么问题请私信或留下评论,一起加油。