Promise
- ES6引入
- 异步编程的一种解决方案
- 常见于网络请求
1.1.1 Promise的基本使用
随笔
网路请求需要异步处理,异步任务 -> 回调函数。
当网络请求复杂的时候,就可能会出现回调地狱。
Promise就是解决这种地狱回调问题的优雅解决方案。
new Promise()
// resolve,reject 本身又是两个函数 new Promise((resolve, reject)=>{ // 第一次异步调用 setTimeout(()=>{ resolve(‘hello world’); }); }).then((data)=>{ // undo 第一次异步调用的回调代码 console.log(data);// hello world // 第二次异步调用 return new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve(); // 成功 // reject('err message'); // 失败 // throw 'err message' }); }); }).then(()=>{ // undo 第二次异步调用的回调代码 // 第三次异步调用 return new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve(); }); }); }).then(()=>{ //undo 第三次异步调用的回调代码 }).catch((err)=>{ console.log(err); // err message }); //对异步的函数进行封装。 // 链式调用 简写 new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve('aaa'); },1000); }).then(res=>{ console.log('first time do something'); // 正常输出 return Promise.resolve(res + '111'); }).then(res=>{ console.log('second time do something'); // 正常输出 return Promise.reject('err message'); }).then(res=>{ console.log('third time do something'); // 这次不会输出,被reject()截断了 }).catch(err=>{ console.log(err); // err message });
1.1.2 对两个异步请求的协调
需求:同时发出两个请求,当两个请求都响应成功后的时候,进行下一步处理。
一般实现
let resultBack_1 = false; let resultBack_2 = false; $ajax({ url: '', success: function(){ console.log('first request back'); resultBack_1 = true; handleResult(); } }); $ajax({ url:'', success: function(){ console.log('secend request back'); resultBack_2 = true; handleResult(); } }); handleResult(){ if (resultBack_1 && resultBack_2) { // do something } }
Promise.all()方法实现
1 Promise.all([ 2 new Promise((resolve, reject)=>{ 3 $ajax({ 4 url: 'url_1', 5 seccess: function(data_1){ 6 resolve(data_1); 7 } 8 }); 9 }), 10 new Promise((resolve, reject)=>{ 11 $ajax({ 12 url: 'url_1', 13 seccess: function(data_2){ 14 resolve(data_2); 15 } 16 }); 17 }) 18 ]).then( results => { 19 console.log(results); // [data_1, data_2] 20 });

浙公网安备 33010602011771号