当前位置:首页 > H5 > 正文内容

js Promise对象,js then catch

高老师5年前 (2019-10-30)H52088

具体文章解释请看廖雪峰老师的文章,这里仅仅记录笔记。国内飞机票点击访问

首次接触可能一脸懵逼,下面的代码手把手敲一遍,100%懂。

(1).基础demo

//创建承诺
let p1 = new Promise(function (resolve, reject) {
    //生成随机数
    var timeout = Math.random() * 2;

    //延迟执行
    setTimeout(() => {
        if (timeout < 1) {
            //小于1成功
            resolve(`success:${timeout}`);
        }
        else {
            //否则失败
            reject(`failed:${timeout}`);
        }
    }, timeout * 1000);
});

//调用承诺,当承诺成功才执行.then回调
let p2 = p1.then(function (result) {
    console.log(result);
});

//调用承诺,当承诺失败才执行.then回调
let p3 = p2.catch(function (reason) {
    console.log(reason);
});

(2).then和catch可以串联起来,上面的写法只是为了告诉你then和catch返回的还是promise对象

let p2 = p1.then(function (result) {
    console.log(result);
}).catch(function (reason) {
    console.log(reason);
});

(3).Promise是如何异步执行的(异步执行的流程中,把执行代码和处理结果的代码清晰地分离)

//获取元素节点
let logging = document.getElementById('logArea');

//显示日志到dom区域
function log(s) {
    var p = document.createElement('p');
    p.innerHTML = s;
    logging.appendChild(p);
}

//创建承诺
let p1 = new Promise(function (resolve, reject) {
    log('start new Promise...');
    var timeOut = Math.random() * 2;
    log('set timeout to: ' + timeOut + ' seconds.');
    setTimeout(function () {
        if (timeOut < 1) {
            log('call resolve()...');
            resolve('200 OK');
        }
        else {
            log('call reject()...');
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}).then(function (result) { 
    log('Done: ' + result);
}).catch(function (reason) {
    log('Failed: ' + reason);
});

(4).多个异步任务依赖,例如先ajax请求第一个接口,再去请求第二个接口,再去请求第三个接口,将三个接口的值相加,严格按接口1,接口2,接口3的顺序执行

//模拟请求接口1,后端返回数字50,
var api1 = function(num){
    return new Promise(function(resolve){
        setTimeout(() => {
            console.log('接口1的数值拿到了,开始去第二个接口拿值');
            resolve(50+num)
    }, 5000);
    });
}

//模拟请求接口2,后端返回数字60,
var api2 = function(num){
    return new Promise(function(resolve){
        setTimeout(() => {
            console.log('接口2的数值拿到了,开始去第三个接口拿值');
            resolve(60+num)
    }, 2000);
    });
}

//模拟请求接口3,后端返回数字60,
var api3 = function(num){
    return new Promise(function(resolve){
        setTimeout(() => {
            console.log('接口3的数值拿到了,开始去第二个接口拿值');
            resolve(60+num)
    }, 1000);
    });
}

//创建承诺
let p1  =  new Promise(function(resolve){
    resolve(0);
});
p1.then(api1).then(api2).then(api3).then(function(result){
    console.log(`3个接口返回的值合计:${result}`);
});

(5).并发请求,同时请求2个接口,将结果集合并

//用户信息接口
var userApi = new Promise(function(resolve){
    resolve({'userId':'18326'});
});

//用户资产接口
var userAssetApi = new Promise(function(resolve){
    resolve({'money':10000000});
});

//并发请求2个接口,2个接口的返回值合并在一起
Promise.all([userApi,userAssetApi]).then(function(result){
    console.log(result);
});

(6).异步任务容错,例如为了保证某个接口高可用,我们在2个服务器部署这个接口,前端ajax请求2个接口,那个先返回就使用那个,避免有接口不可用。

//用户信息接口.服务器1
var userApi1 = new Promise(function(resolve){
    setTimeout(() => {
        resolve({'userId':'18326 from server1'});
    }, 2000); 
});

//用户信息接口.服务器2
var userApi2 = new Promise(function(resolve){
    resolve({'userId':'18326 from server2'});
});

//并发请求2个接口,那个先返回就先用那个,后返回的直接抛弃掉
Promise.race([userApi1,userApi2]).then(function(result){
    console.log(result);
});

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:http://blog.20230611.cn/post/274.html

分享给朋友:

“js Promise对象,js then catch” 的相关文章

HTML5的离线缓存技术

HTML5的离线缓存技术

离线缓存的开启实例使用apache设置 1.apache配置文件搜索Addtype,我的addtype已经存在项目,如下    AddType application/x-compress .Z    AddType application/x-gz...

百度地图,腾讯地图生成导航链接

百度地图,腾讯地图生成导航链接

https://3gimg.qq.com/lightmap/v1/marker/index.html?marker=coord:37.6767600000,112.7297800000&key=TKUBZ-D24AF-GJ4JY-JDVM2-IBYKK-KEBCU&referer=p...

Javascript事件冒泡和捕捉的阻止

Javascript事件冒泡和捕捉的阻止

<!DOCTYPE html> <html> <head> <title>捕捉和冒泡</title> <meta charset="utf-8"> </head> <bo...

Javascript绑定事件和移除事件

Javascript绑定事件和移除事件

<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> </head> <body>...

ajax上传文件,formdata上传文件,ajax上传file文件,原生ajax上传文件,ajax上传图片,ajax上传文件formdata

ajax上传文件,formdata上传文件,ajax上传file文件,原生ajax上传文件,ajax上传图片,ajax上传文件formdata

通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过submit() 方法传输的数据格式相同...

canvs转图片canvs转base64

canvs转图片canvs转base64

二期项目中生成的简历二维码是使用canvs生成的,微信浏览器中不能识别二维码,只能扫码。懒的换phpqrcode,于是转canvs。//设置一个url var url = "{yun:}$config.sy_weburl{/yun}/mingli/index....