Promise

  # Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

适用场景

  # 一般来说我们会碰到的回调嵌套都不会很多,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——回调地狱。
 这时候我们的promise就应运而生、粉墨登场了

promise是用来解决两个问题的:

  # 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
  promise可以支持多个并发的请求,获取并发请求中的数据
  这个promise可以解决异步的问题,本身不能说promise是异步的

  # Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。

  1. let p = new Promise(function(resolve, reject) { //resolve 成功调用 reject 失败调用
  2. //做一些异步操作
  3. setTimeout(() => {
  4. console.log('执行完成');
  5. resolve('我是成功!!');
  6. }, 2000);
  7. });

Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数:

  resolve :异步操作执行成功后的回调函数
  reject:异步操作执行失败后的回调函数

then 链式操作的用法

  所以,从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

  1. p.then(function(data){ // then接受resolve返回的值
  2. console.log(data);
  3. })
  4. .then(function(data){
  5. console.log(data);
  6. })
  7. .then(function(data){
  8. console.log(data);
  9. })

reject的用法 :

  把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。看下面的代码。

  1. let p = new Promise((resolve, reject) => {
  2. //做一些异步操作
  3. setTimeout(function(){
  4. var num = Math.ceil(Math.random()*10); //生成1-10的随机数
  5. if(num<=5){
  6. resolve(num);
  7. }
  8. else{
  9. reject('数字太大了');
  10. }
  11. }, 2000);
  12. });
  13. p.then((data) => {
  14. console.log('resolved',data);
  15. },(err) => {
  16. console.log('rejected',err);
  17. }
  18. );

  # then中传了两个参数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调。

catch的用法

  # 我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?其实它和then的第二个参数一样,用来指定reject的回调。用法是这样:

  1. p.then(function(data){ // 接受成功resolve返回的值
  2. console.log('resolved',data);
  3. }).catch(function(err){ // 接受失败的reject返回值
  4. console.log('rejected',err);
  5. });

效果和写在then的第二个参数里面一样。不过它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。请看下面的代码:

  1. p.then((data) => {
  2. console.log('resolved',data);
  3. console.log(somedata); //此处的somedata未定义
  4. })
  5. .catch((err) => {
  6. console.log('rejected',err);
  7. });

Promise解决回调地狱(多层调用问题)的更多相关文章

  1. 基于PROMISE解决回调地狱问题

    回调地狱问题: 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数, ...

  2. async + promise 解决回调地狱

    // 解决异步回调地狱的方案: async + promise async function writeFile() {   // 打开文件   const fd = await new Promis ...

  3. Promise解决回调地狱

    Promise是JavaScript异步操作解决方案.介绍Promise之前,先对异步操作做一个详细介绍. JavaScript的异步执行 概述 Javascript语言的执行环境是”单线程”(sin ...

  4. JS之用ES6 Promise解决回调地狱(这里以小程序为例)

    首先 写一个请求的方法,如: /** * 银行窗口 * 你需要给我提供相关的相关参数我帮你提交到服务器上 * 我会给你一个等待区的编号给你 你去等待区等待,我处理完成会去等待区通知你 * @param ...

  5. ES6(promise)_解决回调地狱初体验

    一.前言 通过这个例子对promise解决回调地狱问题有一个初步理解. 二.主要内容 1.回调地狱:如下图所示,一个回调函数里面嵌套一个回调函数,这样的代码可读性较低也比较恶心 2.下面用一个简单的例 ...

  6. promise对象解决回调地狱

    先放一张图片感受一下回调地狱 看起来是真的很让人头痛的东西 而现在我这里使用promise对象来解决回调地狱 采用链式的 then,可以指定一组按照次序调用的回调函数. 这时,前一个 then 里的一 ...

  7. Promise,async/await解决回调地狱

    先说一下async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思, 异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 写一个async 函数 as ...

  8. 【JavaScript】 使用Async 和 Promise 完美解决回调地狱

    很久以前就学习过Async和Promise,但总是一知半解的. 今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱. 举个例子 有一个方法 ...

  9. 使用ES6的Promise完美解决回调地狱

    相信经常使用ajax的前端小伙伴,都会遇到这样的困境:一个接口的参数会需要使用另一个接口获取. 年轻的前端可能会用同步去解决(笑~),因为我也这么干过,但是极度影响性能和用户体验. 正常的前端会把接口 ...

随机推荐

  1. Django Auth组件->扩展用户

    Auth用户 1.声明用户表 djangauth/settings.py..............................AUTH_USER_MODEL = 'app01.UserInfo' ...

  2. 把jar包部署为linux服务

    一直未配置成功,直到放弃后reboot了下,才直到错的不是自己的配置,而是自己不懂 1.在touch /etc/rc.d/init.d/tl_c_cons_service(创建新文件) 2.vi /e ...

  3. linux下实现keepalived+nginx高可用

    1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...

  4. AcWing 847. 图中点的层次

    队列 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm ...

  5. 什么情况下用vue.use方法

    链接:https://blog.csdn.net/lxiang222/article/details/103376150 简而言之

  6. jinja 语法 - 整型转字符串

    大多数 jinja 相关的问题,其实查文档就解决了,但后来遇到这个问题,使得我把 jinja 官方文档,api.样例等,认真读了个遍= =. 发现没有直接的办法可以将整型转为字符串,对于需要进行字符串 ...

  7. oss创建文件夹

    在进行putObject时,第二个参数写成path/your-object即可

  8. java8下 枚举 通用方法

    在项目中经常用到枚举作为数据字典值和描述的相互转化. 用法如下: public enum CommunicationParamsCom { COM_1(1, "COM1"), CO ...

  9. reduce 方法(升序)

    语法: array1.reduce(callbackfn[, initialValue]) 参数 定义 array1 必需.一个数组对象. callbackfn 必需.一个接受最多四个参数的函数.对于 ...

  10. Ubuntu 国内安装 kubernetes

    由于墙的原因,国内要安装 kubernetes 非常的麻烦,因此只要解决这个问题,就可以顺利安装 kubernetes 的 三个官法工具 kubelet.kubeadm.kubectl. 安装环境: ...