资讯专栏INFORMATION COLUMN

用Promise构造函数来解决地狱回调问题

darryrzhong / 1397人阅读

摘要:简介是一个构造函数,既然是构造函数,那么,我们就可以得到一个的实例在上,有两个函数,分别叫做成功之后的回调函数和失败之后的回调函数在构造函数的属性上,有一个方法,也就说,只要是构造函数创建的实例,都可以访问到方法表示一个异步操作每当我们一个

简介

Promise 是一个 构造函数,既然是构造函数, 那么,我们就可以 new Promise() 得到一个 Promise 的实例;

在 Promise 上,有两个函数,分别叫做 resolve(成功之后的回调函数) 和 reject(失败之后的回调函数)

在 Promise 构造函数的 Prototype 属性上,有一个 .then() 方法,也就说,只要是 Promise 构造函数创建的实例,都可以访问到 .then() 方法

Promise 表示一个 异步操作;每当我们 new 一个 Promise 的实例,这个实例,就表示一个具体的异步操作;

既然 Promise 创建的实例,是一个异步操作,那么,这个 异步操作的结果,只能有两种状态:

状态1: 异步执行成功了,需要在内部调用 成功的回调函数 resolve 把结果返回给调用者;

状态2: 异步执行失败了,需要在内部调用 失败的回调函数 reject 把结果返回给调用者;

由于 Promise 的实例,是一个异步操作,所以,内部拿到 操作的结果后,无法使用 return 把操作的结果返回给调用者; 这时候,只能使用回调函数的形式,来把 成功 或 失败的结果,返回给调用者;

我们可以在 new 出来的 Promise 实例上,调用 .then() 方法,【预先】 为 这个 Promise 异步操作,指定 成功(resolve) 和 失败(reject) 回调函数;

举个例子
const fs = require("fs")

function getFileByPaht(fpath) {
  var promise = new Promise(function (resolve, reject) {
    fs.readFile(fpath, "utf-8", (err, dataStr) => {
      if (err) return reject(err);
      resolve(dataStr);
    });
  });
  return promise;
}

getFileByPaht("./files/3.txt")
.then(function (dataStr) {
  console.log(dataStr);
}, function (err) {
  console.log(err.message);
})
Promise的内部执行顺序

用Promise的 .then() 方法解决地狱回调
注意: Promise的 reject 部分传入的函数可以为空,即可不写文件读取失败后的操作,
getFileByPath("./files/1222.txt")
  .then(function (data) {
    console.log(data);
    return getFileByPath("./files/2.txt");
  }, 
  .then(function (data) {
    console.log(data);
    return getFileByPath("./files/3.txt");
  })
  .then(function (data) {
    console.log(data);
  })
Promise中的异常处理

情况一:在读取文件出错的部分报错,但不影响后方代码的执行

getFileByPath("./files/1222.txt")
  .then(function (data) {
    console.log(data);
    return getFileByPath("./files/2.txt");
  }, function (err) {
    console.log("读取失败:" + err.message);
    return getFileByPath("./files/2.txt");
  })
  .then(function (data) {
    console.log(data);
    return getFileByPath("./files/3.txt");
  })
  .then(function (data) {
    console.log(data);
  })

情况二:如果前面任何的Promise执行失败,就停止运行后面的方法(catch捕获机制)

getFileByPath("./files/1222.txt")
  .then(function (data) {
    console.log(data);
    return getFileByPath("./files/2.txt");
  })
  .then(function (data) {
    console.log(data);
    return getFileByPath("./files/3.txt");
  })
  .then(function (data) {
    console.log(data);
  })
  .catch(function (err) {  
    console.log("异常捕获: " + err.message);
  })

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

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

相关文章

  • 将"回调地狱"按在地上摩擦的Promise

    摘要:回调地狱的问题在于写法过于繁琐不够优雅代码维护炒鸡蛋疼,所以一直被前端程序猿所诟病,尤其是维护类似代码的时候简直日了一群哈士奇。,对象状态以和为分水岭。方法返回一个带有拒绝原因参数的对象摘自对的解释。并且返回的也是一个对象。 这是一段旁白 异步虐我千百遍,我待异步如初恋!!做前端的同学做异步肯定都不陌生。因为JavaScript是单线程语言(也就是说不支持多线程编程,这不是废话么啊喂!...

    Yu_Huang 评论0 收藏0
  • 2019面试笔记

    摘要:使用构造函数创建对象后,新对象与构造函数没有关系了,新对象的属性指向的是构造函数的原型对象。构造继承使用父类的构造函数来增强子类的实例,等于是在子类的构造函数内部执行。 一.js原始类型: 在js中,存在着6种原始值: * boolean * number * string * undefined * null * symbol 注意: 虽然typeof null输出的是o...

    nidaye 评论0 收藏0
  • 深入前端-JavaScript异步编程

    摘要:缺点无法取消当处于状态时,无法得知目前进展到哪一个阶段错误不能被生成器什么是函数是提供的一种异步编程解决方案,语法行为与传统函数完全不同函数有多种理解角度。 JavaScript的执行机制在上篇文章中进行了深入的探讨,那么既然是一门单线程语言,如何进行良好体验的异步编程呢 回调函数Callbacks 当程序跑起来时,一般情况下,应用程序(application program)会时常通...

    2json 评论0 收藏0
  • 深入前端-JavaScript异步编程

    摘要:缺点无法取消当处于状态时,无法得知目前进展到哪一个阶段错误不能被生成器什么是函数是提供的一种异步编程解决方案,语法行为与传统函数完全不同函数有多种理解角度。 JavaScript的执行机制在上篇文章中进行了深入的探讨,那么既然是一门单线程语言,如何进行良好体验的异步编程呢 回调函数Callbacks 当程序跑起来时,一般情况下,应用程序(application program)会时常通...

    raise_yang 评论0 收藏0

发表评论

0条评论

darryrzhong

|高级讲师

TA的文章

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