乱码
小说: 烂尾楼 作者:衣衫似风雪 字数:1432 更新时间:2024-03-29 17:50:21
18.JS中的异常处理
try..catch
try..finally
try...catch..finally
19.ES6 Promise 解决回调地狱
19-1、 promise:为了解决异步编程中的回调地狱而产生
Promise的实例需要接收一个函数作为参数
该函数又需要接收两个函数数作为参数
resolve 函数
reject 函数
19-2、promise 的三种状态
pending 进行中
fullfilled 已成功 resolved 成功 执行resolve函数
rejected 已失败 rejected 失败 执行reject函数
19-3、then方法
参数一:是resolve函数的实现
参数二:是reject函数的实现
19-4、then方法返回值的是一个新的Promise实例
注意,不是原来那个Promise实例
若前一个回调函数返回的是一个Promise对象(即有异步操作)时,
后一个回调函数,会等待该Promise对象的状态发生变化,才会被调用。
19-5、promise的异常处理
建议总是使用catch方法。
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。
Promise 的状态一旦改变,就永久保持该状态,不会再变了。
catch方法返回的还是一个 Promise 对象
catch和reject同时出现时,只执行reject
19-6、多个异步操作
// 加载图片函数
function loadPic(id, src, sec) {
return new Promise((resolve, reject) => {
let oImg = new Image();
oImg.onload = function () {
resolve(oImg);
}
oImg.onerror = function () {
reject(`编号为${id}的任务失败`);
}
// oImg.src = src;
setTimeout(() => {
oImg.src = src;
}, sec); //延迟加载函数
})
}
let s1 = "远程图片";
let s2 = "远程图片";
let p1 = loadPic('001', s1, 1000);
let p2 = loadPic('002', s2, 100);
// Promise.all 方法
// 当所有图片都加载完在执行后续动作,有一张失败都不执行then
let p = Promise.all([p1, p2]); //all返回新的promise对象
p.then(data=>{
console.log(data,'加载成功');
document.body.append(data[0],data[1]);
}).catch(err=>{
console.log(err);
}).finally(()=>{
console.log('不论成功与否,我都执行');
});
// Promise.race 方法
// 注:
// 1.只要有一张图片加载完成,就执行then的resolve实现
// 2.如果先加载的图片有失败的情况,后续图片就不加载,直接执行catch 或 reject
let p = Promise.race([p1, p2]);
p.then(data => {
console.log(data); //只返回最先加载成功的那个
document.body.append(data); //由于设置了延迟,所以第二个先加载完成
}).catch(err => {
console.log(err);
})
作者:也在水湄
链接:https://www.jianshu.com/p/d23a506cdca2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
