资讯专栏INFORMATION COLUMN

promise初识

codercao / 1333人阅读

摘要:一涉及技术二简介官方文档三种状态进行中已完成,又称已失败只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

一、涉及技术

jquery、vue、php

二、Promise简介

MDN官方文档:Promise

三种状态:

Pending(进行中)

Resolved(已完成,又称 Fulfilled)

Rejected(已失败)

只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

三、常用方法

Promise.resolve()

Promise.reject()

Promise.prototype.catch()

Promise.prototype.then()

Promise.all()

Promise.race()

四、简单示例 1、多个Promise使用
var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve("hello");
    }, 1000);
});
promise.then(function(str) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(str+" world");
        }, 1000);
    });
}).then(function(str) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(str+" !");
        }, 1000);
    });
}).then(function(str) {
    console.log(str); // 3秒后打印 hello world !
});
2、catch与finaly
var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        reject("异步报错~");
    }, 1000);
}).catch(function(err) { // 捕获reject暴露的错误
    console.log(err);
}).finally(function() { // 不管resolve/reject都执行
    console.log("complete");
});
五、前后端配合 1、单个Promise

后端数据

demo.php

// 获取随机字符串
function getRandChar($length) {
    $str = "";
    $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    $max = strlen($strPol)-1;
    for($i=0;$i<$length;$i++){
        $str.=$strPol[rand(0,$max)];
    }
    return $str;
}
if($_GET["action"] == "test") {
    $data = [
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
    ];
    echo json_encode($data);
}

前端页面

demo.html




    
    promise
    
    


    
    
  • {{ index }} {{ item.name }}

运行结果:

2、Promise.all()
Promise.all(p1, p2, ...),此方法需要所有的promise都成功才成功。。
var promise1 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("请求报错~");
        }
    });
});
var promise2 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("请求报错~");
        }
    });
});
var promiseAll = Promise.all([promise1, promise2]);
promiseAll.then(function(data) {
    console.log(data);
}, function(err) {
    console.log(err);
});

结果

如果我们把其中一个url 改成 demo2.php?action=test 就会请求失败~

Promise.all() 和 jquery的$.when() 有些类似

$.when()的写法

var ajax1 = $.ajax({type: "get", url: "demo1.php", data: {}, dataType: "json"}),
    ajax2 = $.ajax({type: "get", url: "demo2.php", data: {}, dataType: "json"}),
    ajax3 = $.ajax({type: "get", url: "demo3.php", data: {}, dataType: "json"});
$.when([ajax1, ajax2, ajax3]).then(function(data1, data2, data3) {
    console.log(data1, data2, data3);
}, function() {
    console.log("%c 请求报错~", "color: red");
});
3、Promise.race()
Promise.race(p1, p2, ...),这个方法会返回率先成功的那个,如果都不成功,则执行reject。
var promise1 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("请求报错~");
        }
    });
});
var promise2 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("请求报错~");
        }
    });
});

var promiseRase = Promise.race([promise1, promise2]);
promiseRase.then(function(data) {
    console.log(data);
}, function(err) {
    console.log(err);
});
4、多个ajax请求
var app = new Vue({
    el: "#app",
    data: {
        list: []
    },
    methods: {
        ajaxReq: function(resolve, reject) {
            $.ajax({
                type: "get",
                url: "demo.php?action=test",
                dataType: "json",
                success: function(res) {
                    resolve(res);
                },
                error: function() {
                    reject("请求报错~");
                }
            });
        }
    },
    mounted: function() {
        var promise1 = new Promise((resolve, reject) => {
            this.ajaxReq(resolve, reject);
        });
        promise1.then((data)=> {
            console.log("第一次:", data);
            return new Promise((resolve, reject) => {
                this.ajaxReq(resolve, reject);
            });
        }).then((data) => {
            console.log("第二次:", data);
            return new Promise((resolve, reject) => {
                this.ajaxReq(resolve, reject);
            });
        }).then((data) => {
            console.log("第三次:", data);
        });
    }
});

这是使用了函数封装,实际上项目中,可能不是这样的,连贯操作,可能是下一个请求需要上一个请求的返回值

var promise1 = new Promise((resolve, reject) => {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res, 2);
        },
        error: function() {
            reject("请求报错~");
        }
    });
});
promise1.then((data)=> {
    if(data.length > 0) {
        return new Promise((resolve, reject) => {
                    $.ajax({
                        type: "get",
                        url: "demo.php?action=test",
                        dataType: "json",
                        success: function(res) {
                            resolve(res.concat(data)); // 因为resolve只能接口一个参数,所以concat了一下
                        },
                        error: function() {
                            reject("请求报错~");
                        }
                    });
                });   
    }
}).then((data1) => {
    console.log(data1);
});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89384.html

相关文章

  • 初识fetch

    摘要:后面可以跟对象,表示等待才会继续下去执行,如果被或抛出异常则会被外面的捕获。没有获取状态方法,标准没有提供获取当前状态或者的方法。只允许外部传入成功或失败后的回调。这种进度通知的功能还没有用过,暂不知道如何替代。 始终不是很懂fetch的作用,然后查了很多资料,看了一篇不错的文章,结合自己之前学习的Promise,然后做一篇文章,稍微记录一下。传统 Ajax 已死,Fetch 永生 虽...

    rickchen 评论0 收藏0
  • Generator初识

    摘要:一简介函数是引入的新型函数,用于异步编程,跟对象联合使用的话会极大降低异步编程的编写难度和阅读难度。二简单示例和注意函数不能直接使用,是通过方法获取的返回结果,而可以提前终止函数。 一、简介 Generator函数是ES6引入的新型函数,用于异步编程,跟Promise对象联合使用的话会极大降低异步编程的编写难度和阅读难度。 与普通函数的区别: function关键字与函数名之间有一个...

    beita 评论0 收藏0
  • 初识JavaScript EventLoop

    摘要:指的是计算机系统的一种运行机制。环境中的执行顺序是随机的这一次,彻底弄懂执行机制的规范和实现 showImg(https://segmentfault.com/img/remote/1460000012913034?w=800&h=421); Event Loop指的是计算机系统的一种运行机制。JavaScript采用此机制解决单线程引发相关问题 在浏览器中的web应用会涉及到.Jav...

    ZHAO_ 评论0 收藏0
  • 初识vue-element-admin

    摘要:最近看了一下项目,它是基于创建的项目创建项目安装默认手动选择配置,看个人项目需求支持使用书写源码支持。支持代码风格检查和格式化。权限验证那里也做了递归的处理不显示在菜单栏。组件内的在组件内使用可以拿到 最近看了一下vue-element-admin项目,它是基于vue-cli3创建的项目 创建vue-cli3项目 安装vue-cli npm install -g @vue/cli v...

    My_Oh_My 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<