博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ES6入门12】:Promise
阅读量:6504 次
发布时间:2019-06-24

本文共 4184 字,大约阅读时间需要 13 分钟。

Promise基本用法

Promise是一种异步编程的解决方案

1.es5的回调

{    let ajax = function (callback) {        console.log('run1');        setTimeout(function () {            callback && callback.call();        }, 1000);    };    ajax(function () {        console.log('timeout1');    });    // 结果:立马输出 run1,1秒之后输出 timeout1    // 1.如果过程变得复杂,a()=>b()=>c()=>d()... ,用回调来处理会使代码变得复杂    // 2.代码复杂影响后期维护,很难一眼看出回调之间的顺序问题,代码难以阅读}

2.es6的Promise

{    let ajax = function () {        console.log('run2');        // 返回一个对象(Promise实例),这个实例具有then()方法,就是执行下一步的功能        return new Promise(function (resolve, reject) {            // resolve表示执行下一步操作 reject表示中断当前操作            setTimeout(function () {                resolve();            }, 1000);        });    };    ajax().then(function () {        // 这个方法对应resolve        console.log('timeout2');    }, function () {        // 这个方法对应reject    });    // 结果:立马输出 run2,1秒之后输出 timeout2    // 结果和es5一样,但是代码可读性、可维护性更高}

3.then()的串联操作

{    let ajax = function () {        console.log('run3');        return new Promise(function (resolve, reject) {            setTimeout(function () {                resolve();            }, 2000);        });    };    ajax().then(function () {        // 返回Promise实例,通过不断的下一步下一步,实现了串联操作的结果        return new Promise(function (resolve, reject) {            setTimeout(function () {                resolve();            }, 3000);        });    }).then(function () {        console.log('timeout3');    });    // 结果:立马输出 run3,5秒之后输出 timeout3}

4.catch方法

{    let ajax = function (num) {        console.log('run4');        return new Promise(function (resolve, reject) {            if (num >= 5) {                resolve();            } else {                throw Error(`出错了,${num}小于5`);            }        });    };    // catch方法用来捕获异常    ajax(6).then(function () {        console.log(6);    }).catch(function (err) {        console.log(err);    });    // 结果:输出 run4 6    ajax(3).then(function () {        console.log(3);    }).catch(function (err) {        console.log(err);    });    // 结果:输出 run4  Error: 出错了,3小于5}

Promise.all()

例子:所有图片加载完再统一添加到页面

{    function loadImg(src) {        return new Promise((resolve, reject) => {            let img = document.createElement('img');            img.src = src;            // onload监听图片加载完成            img.onload = function () {                resolve(img);            };            // onerror监听图片加载失败            img.onerror = function (err) {                reject(err);            };        });    }    function showImgs(imgs) {        console.log(imgs); // [img, img, img] 三个img对象        imgs.forEach(function (img) {            document.body.appendChild(img);        });    }    // Promise.all 把多个Promise实例当做一个Promise实例    // Promise.all(array).then(fn),array对应多个Promise实例,当所有实例状态发生改变时,新的Promise实例才会跟着发生变化    // Promise.all也是返回Promise实例,所以也有.then()方法    // 当三张图片都加载完成,才会执行showImgs,如果其中有图片正在加载,不会执行showImgs,页面上看不到任何一张图片    Promise.all([        loadImg('https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.webp'),        loadImg('https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2529571873.webp'),        loadImg('https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2395733377.webp')    ]).then(showImgs);}

Promise.race()

例子:有一个图片加载完就添加到页面,其余的不管,只显示最先加载完成的一张图片

{    function loadImg(src) {        return new Promise((resolve, reject) => {            let img = document.createElement('img');            img.src = src;            // onload监听图片加载完成            img.onload = function () {                resolve(img);            };            // onerror监听图片加载失败            img.onerror = function (err) {                reject(err);            };        });    }    function showImgs(img) {        let p = document.createElement('p');        p.appendChild(img);        document.body.appendChild(p);    }    // 当某一张图片率先加载完成,执行showImgs显示这张图片,剩余图片不再响应    Promise.race([        loadImg('https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.webp'),        loadImg('https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2529571873.webp'),        loadImg('https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2395733377.webp')    ]).then(showImgs);}

转载地址:http://ibqyo.baihongyu.com/

你可能感兴趣的文章
【MySQL使用技巧】JDBC连接
查看>>
HTML5边玩边学(9):俄罗斯方块就是这么简单 之 数据模型篇
查看>>
Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt【转】
查看>>
稳定,实际是暴风雨来临前的死寂
查看>>
十一有感
查看>>
《OOD启思录》:61条面向对象设计的经验原则
查看>>
计算二重定积分
查看>>
1078: 输入入门(3)
查看>>
Linux内核驱动之GPIO子系统(一)GPIO的使用【转】
查看>>
关于 WebRequest.RegisterPrefix
查看>>
QName
查看>>
object does not contain a definition for get_range
查看>>
C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ? ....
查看>>
springmvc学习笔记--json--返回json的日期格式问题
查看>>
JS组件系列——分享自己封装的Bootstrap树形组件:jqTree
查看>>
一行时间的输出
查看>>
Storm概念学习系列之storm简介
查看>>
QTP的那些事--QC远程执行QTP经常出现QTP崩溃现象解决方案
查看>>
SharePoint 2013 Nintex Workflow 工作流帮助(五)
查看>>
共享库方案解决WAS中JAR包冲突
查看>>