一、概述

Promise是异步编程的解决方案

异步事件的处理:

封装的异步请求函数不能立即获取结果,

通常会传入另外一个函数,在请求成功的时候将数据通过传入的函数回调出去

如果只是一个简单的请求,那么这种方案非常的麻烦

但是,如果请求非常复杂的时候,就会出现回调地狱

<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
// todo ... 开始写 jQuery 代码...
$.ajax('url-link or api-address', function (data1) {
$.ajax('url-link or api-address', function (data2) {
$.ajax('url-link or api-address', function (data3) {
$.ajax('url-link or api-address', function (data4) {
console.log(data4);
})
})
})
});
});
</script>

二、语法样例:

    /* 链式编程警告 !!!!  */

    /* 构造参数是一个函数 入参函数本身 包括两个参数, 解析 与 拒绝 */
/* resolve, reject 也是函数。。。 */
new Promise((resolve, reject) => {
setTimeout(() => { /* 模拟第一次的异步请求 */
resolve(); // 调用 resolve 会直接跳转到下面的then函数执行
}, 1000);
}).then(() => { /* 第一次得到data结果的处理逻辑 */
console.log('request01 executed...');
console.log('request01 executed...');
console.log('request01 executed...'); return new Promise((resolve, reject) => {
setTimeout(() => { /* 第二次的异步请求 */
resolve();
}, 1000);
}).then(() => { /* 第二次得到data结果的处理逻辑 */
console.log('request02 executed...');
console.log('request02 executed...');
console.log('request02 executed...'); return new Promise((resolve, reject) => {
setTimeout(() => { /* 第三次的异步请求 */
resolve();
}, 1000);
}).then(() => {
console.log('request03 executed...');
console.log('request03 executed...');
console.log('request03 executed...');
});
});
});
/* 上述代码可以看出我们的Promise结构就分为两部分,构造器参数的执行 和 then函数 */
/* 构造器负责请求的发生, 而then函数负责响应数据的逻辑处理 */

如果是响应失败的情况,再引用catch函数捕获处理:

    new Promise((resolve, reject) => {
setTimeout(() => { /* 模拟第一次的异步请求 */
resolve(); // 调用 resolve 会直接跳转到下面的then函数执行
}, 1000);
}).then(() => { /* 第一次得到data结果的处理逻辑 */
console.log('request01 executed...');
console.log('request01 executed...');
console.log('request01 executed...'); return new Promise((resolve, reject) => {
setTimeout(() => { /* 第二次的异步请求 */
resolve();
}, 1000);
}).then(() => { /* 第二次得到data结果的处理逻辑 */
console.log('request02 executed...');
console.log('request02 executed...');
console.log('request02 executed...'); return new Promise((resolve, reject) => {
setTimeout(() => { /* 第三次的异步请求 */
resolve();
}, 1000);
}).then(() => {
console.log('request03 executed...');
console.log('request03 executed...');
console.log('request03 executed...');
}).catch(error => {
console.log(error);
});

}).catch(error => {
console.log(error);
});

}).catch(error => {
console.log(error);
});

三、Promise的三种状态

Pending等待状态:

请求进行中,定时器尚未到达触发时间

Fullfill满足状态:

主动回调resolve时,回调then函数

Reject拒绝状态:

主动回调rejec时t,回调执行catch函数

四、All方法

语法演示

<!--<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>-->
<script src="./../../dependencies/jquery.min.js"></script>
<script type="text/javascript"> /* all方法注入的是一个数组 */
Promise.all([
new Promise((resolve, reject) => {
$.ajax({
url : 'url',
success : data => {
resolve(data);
}
})
}),
new Promise((resolve, reject) => {
$.ajax({
url : 'url',
success : data => {
resolve(data);
}
})
}),
]).then(results => {
console.log(results[0]);
console.log(results[1]);
});
</script>

案例:

/* 方法注入的是一个数组 */
Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result');
}, 1000);
}),
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result');
}, 1000);
}),
]).then(results => {
console.log(results);
console.log(results[0]);
console.log(results[1]);
});

应用场景:同时发送两个以上的异步请求

【Vue】Re19 Promise的更多相关文章

  1. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

    前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...

  2. 【vue】移动端demo资料

    http://imzjh.com/inew/#/(移动端demo) https://github.com/liangxiaojuan/eleme(饿了么git地址) https://github.co ...

  3. 【vue】MongoDB+Nodejs+express+Vue后台管理项目Demo

    ¶项目分析 一个完整的网站服务架构,包括:   1.web frame ---这里应用express框架   2.web server ---这里应用nodejs   3.Database ---这里 ...

  4. 【vue】本地开发mock数据支持

    项目离不开数据渲染的支持,为本地开发配置 数据  支持. (一)方式一:安装JSON Server搭建mock数据的服务器 json Server 是一个创建 伪RESTful服务器的工具. 配置流程 ...

  5. 【vue】npm run mock & npm run dev 无法同时运行的解决

    [关于系统,没注明的都是windows系统,若以后用的是mac系统则会另外备注] 当项目数据是通过mock搭建而成(参照:[vue]本地开发mock数据支持)时,运行mock服务器和项目的命令 就参照 ...

  6. 【VUE】自定义组件

    [VUE]自定义组件 转载: ============================================ ======================================== ...

  7. 【VUE】使用问题记录

    [VUE]使用问题记录 ===================================================================== 1.Vue.nextTick 修改数 ...

  8. 【VUE】数组

    [VUE]常用函数 转载:https://www.cnblogs.com/yangchongxing/p/10637087.html 目录 ============================== ...

  9. 【vue】生成接口模拟数据

    目录 方案一:自定义模拟数据 Step1 创建json文件 Step2 在 vue.config.js 中配置 Step3 在组件中使用 (方式一) Step3 封装api (方式二) Step4 在 ...

  10. 【Vue】详解Vue生命周期

    Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之 ...

随机推荐

  1. 【WPF】Dispatcher 与消息循环

    这一期的话题有点深奥,不过按照老周一向的作风,尽量讲一些人鬼都能懂的知识. 咱们先来整个小活开开胃,这个小活其实老周在 N 年前写过水文的,常阅读老周水文的伙伴可能还记得.通常,咱们按照正常思路构建的 ...

  2. java小记-scanner

    不想打字也是我的罪过吗? 作业2: 老师的代码: 结果 我的代码看起来冗余: 想说的: 我的本意是以为scanner只能记录一个数,然后就想着输入两次就能算两个数了,但没想到人家只是让你输就完了.不要 ...

  3. ansible-role角色

    官网文档 https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html 为什么要用role 之前你部署的n ...

  4. 在Ubuntu系统安装Anaconda及Python

      本文介绍在Linux Ubuntu操作系统的电脑中,安装Anaconda环境与Python语言的方法.   在之前的文章Anaconda与Python环境在Windows中的部署中,我们介绍了在W ...

  5. java多线程-2-概念和实现机制

    知其然,而知其所以然! 在计算机领域,有多种操作系统,常见的有windows家族和unix/Linux家族,它们都支持多任务的计算模式. 它们实现多任务的机制是差不多的,这点在<<操作系统 ...

  6. HTTP长连接、短连接、Linux网络优化

    无连接 含义:每次传输完数据后就断开连接. 因为早期互联网规模小,并且http具有瞬时性,突发性,服务器同时处理着多个请求.所以采用无连接的方式.以便于腾出资源处理其他请求. 无状态 顺便说一说无状态 ...

  7. 01-前端开发Vscode插件配置

    01 自动保存配置 02 空格渲染方式 配置好以后,可以看到代码的空格有几个,以点的方式呈现,1个点表示1个空格 03 图标插件 VSCode Great Icons 04 缩进 推荐使用2 05 v ...

  8. vim中ctags 的使用

    --- title: vim中ctags 的使用 EntryName: vim-config-with-ctags date: 2020-08-19 11:17:38 categories: tags ...

  9. 一招解决github访问慢的问题

    ​ 之前我在网上搜过解决办法,其中一个是修改 hosts 文件,但是效果不太理想.我在这里给大家推荐github上的一个开源项目:FastGithub .用了这个之后,效果就比较理想了,次次都能访问到 ...

  10. 数据结构—包(Bag)

    数据结构中的包,其实是对现实中的包的一种抽象. 想像一下现实中的包,比如书包,它能做什么?有哪些功能?首先它用来装东西,里面的东西可以随便放,没有规律,没有顺序,当然,可以放多个相同的东西.其次,东西 ...