ECMAScript6:promise
来自CloudWiki
ES6给出了promise 这一强大的异步编程解决方案。
promise构造函数
一个promise 可以通过promise构造函数来创建,
执行器函数 接收两个参数,分别是resolve函数和reject函数,
异步操作成功时调用resolve函数,失败时调用reject函数
const promise = new Promise(function(resolve, reject) { // 开启异步操作 setTimeout(function(){ try{ let c = 6 / 0 ; // 执行成功调用resolve函数 resolve(c); }catch(ex){ // 执行失败调用reject函数 reject(ex); } }, 1000); });
在promise状态改变后,怎么去根据不同的状态去做相应的处理呢 ?
promise的then方法
它接受两个参数,一个是promise状态变为fulfilled时要调用的函数,
一个是当promise状态变为rejected时要调用的函数。
这两个参数都是可选的。
promise.then(function(<nowiki>在此插入非格式文本value){
// 完成 console.log(value); // 3 },function(err){ // 拒绝 console.error(erro.message); })</nowiki>
promise的catch方法
promise对象还有一个catch方法,用于执行失败后进行处理,
一般then和catch一起使用
promise.then(function(value){ // 完成 console.log(value); // 3 }).catch(function (err){ // 拒绝 console.error(err.message); });
promise的链式调用
链式调用时,可以给后续的promise传递数据。
const promise = new Promise((resolve, reject) => { // 调用setTimeout模拟异步操作 setTimeout( ()=> { let intArray = new Array(20); for(let i=0; i<20; i++){ intArray[i] = parseInt(Math.random() * 20, 10); } // 成功后调用resolve resolve(intArray); },1000); // 该代码会立即执行 console.log("开始生成一个随机数的数组") }); promise.then(value => { value.sort((a,b) => a-b); return value; }).then(value => console.log(value));
const promise = new Promise((resolve, reject)=>{ resolve("Hello Word"); }); promise.then((value) => { console.log(value); throw new Error("错误"); }).catch(err => console.error(err.message));