什么是Promise
Promise对象是用于表示一个异步操作的最终状态(完成或失败)以及其返回的值 。
什么是同步 , 异步
同步任务会阻塞程序的执行 , 如alert , for
异步任务不会阻塞程序的执行 , 如setTimeou
使用Promise , then , catch , finally
Promise.all 和 Promise.race
Promise.resolve 和 Promise.reject
回调与Promise回调函数 , 用于请求数据
function backFunction(fn) { setTimeout(function() { fn && fn(); }, 1000);}// 调用backFunction(function() { console.log(1); // 1 backFunction(function() { console.log(2); // 2 backFunction(function() { console.log(3); // 3 }); });});Promise
function d() { return new Promise(resolve = { setTimeout(function() { resolve(); // resolve成功的时候要做的事情 },1000); // 1秒后调用resolve() , 它是一个函数 })}d() .then(function() { console.log(1); return d(); // Promise实例 }) .then(function() { console.log(2); return d(); // Promise实例 }).then(function() { console.log(3); });对比回调回调函数 , 用于请求数据
我自己是一名从事了多年开发的web前端老程序员 , 目前辞职在做自己的web前端私人定制课程 , 今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货 , 各种框架都有整理 , 送给每一位前端小伙伴 , 想要获取的可以关注我的搜索号并在后台私信我:前端 , 即可免费获取 。
function backFunction(fn) { setTimeout(function() { fn && fn(); }, 1000);}// 调用backFunction(function() { console.log(1); // 1 backFunction(function() { console.log(2); // 2 backFunction(function() { console.log(3); // 3 }); });});信任问题// 使用第三方库 回调function method(fn) { // 回调 setTimeout(function() { // 回调 fn && fn(); // 有可以有bug , 被多调用一次 fn && fn(); },1000);}// promise一旦被调用 , 成功或者是失败后 , 就不能再被修改function method() { return new Promise(resolve => { setTimeout(function() { //成功 resolve(); // 再调用就不会执行 resolve(); },1000); });}// 控制反转function method(fn) { setTimeout(function() { // 执行回调 fn && fn.call({a:1, b:2)}; // 改变指向 },1000);}function method(fn) { return new Promise(resolve => { setTimeout(() => { resolve(); },1000); });}错误处理hen(resolve, reject)
then方法中的第二个回调 , 是失败的时候要做的事情
catch
使用实例的then方法 , 可以捕获错误
finally
不论成功与否 , finally中的内容一定会执行
function fn(val) { return new Promise((resolve, reject) => { if(val) { resolve(); // 成功的时候 } else { reject(); // 失败的时候 } });}function fn(val) { return new Promise((resolve, reject) => { if(val) { resolve(); // 成功的时候 } else { reject(); // 失败的时候 } });}catch会捕获错误 , 如果在回调中没有对错误进行处理
fn(true) .then(data => { console.log(data); return fn(false); }) .then( () => { console.log(&39;da&39;); // 不会执行 , 没处理错误 }) .then( () => {}) .catch(e => { console.log(e); return fn(false); }); // 直接输出到这不能保证catch被执行如果没有对失败做出处理 , 会报错
fn(true).then(data => { console.log(data); return fn(false); }) .catch(e=> { // 捕获错误 console.log(e); return fn(false); }) .finally( () => { console.log(100); });Promise的三种状态pending为进行中的状态 , fulfilled为成功的状态 , rejected为失败的状态 。状态的改变时不可返的 , 一旦决议就不能修改(决议 , 状态的改变为决议) , 状态只能从pending到fulfilled , 或者 , 从pending到rejected 。
Promise.all方法可以把多个promise的实例包装成一个新的promise实例
Promise.all( [promise1, promise2] ) : Promise数组中 , 如果promise都为true , 则返回为true , 决议为成功如果数组中有一个为promise , 那么返回的是false , 决议为失败如果是一个空数组 , 那么返回为true , 决议为成功模式多个请求的数据
function getData1() { return new Promise((resolve, reject) => { setTimeout( () => { console.log(&39;第一条数据加载成功&39;); resolve(&39;data1&39;); },1000); });}function getData2() { return new Promise((resolve, reject) => { setTimeout( () => { console.log(&39;第二条数据加载成功&39;); resolve(&39;data2&39;); },1000); });}function getData3() { return new Promise((resolve, reject) => { setTimeout( () => { console.log(&39;第三条数据加载成功&39;); resolve(&39;data3&39;); // 改为 reject(&39;err&39;) },1000); });}let p = Promise.all( [getData1(), getData2(), getData3()] );p.then(arr => { console.log(arr);});// 失败p.then(arr => { console.log(arr);}, e => { console.log(e);});let p = Promise.all([]); // 决议为成功p.then( () => { console.log(`da`);}, e => { console.log(e);});第一条数据加载成功第二条数据加载成功第三条数据加载成功不用Promise.all
- 戒指在中指是什么含义 中指戒指什么意思是什么
- 五大常任理事国都是谁 五大常任理事国 联合国五常国家
- 戒指的戴法和意义女 戒指的戴法和意义 情侣戒指男女怎么戴
- 联合国教科文组织宣布世界第二批“人类口头和非物质遗产代表作” 古琴在哪一年被联合国教科文组织
- 银戒指可以戴着洗脸吗 银戒指可以戴着洗澡吗
- 读书的由来100字左右 读书的由来
- 鸡蛋加银戒指驱风原理 鸡蛋加银戒指驱风真相
- cf戒指在哪里 CF中的饰品怎么变换属性
- 戒指的戴法和意义男女图解 戒指的戴法和意义 女士戒指戴法含义
- 直径16mm的戒指 戒指直径16mm是几号