promise入门

前言

老生常谈promise 对于promise大部分人应该不陌生了,他是ES6的新特性之一,若是你是一个追求潮流的coder那么你应该用过axios请求方式,这个向后台发送请求的方式就用到了promise 我接触promise是一年前,部门的程序员会轮流培训,恰好当时我在看一些关于axios的东西,就准备培训一些关于promise的知识,因此我就找了不少关于promise的博客,看的也是云里雾里,可想而知培训的效果也不是很好ios

promise再探

promise很火,能够说是程序员居家旅行必备的技能之一了,因此说对于这样的东西,咱们最好仍是吃透它,这样才不会在代码当中迷失。程序员

promise的做用

大多数人开发的过程当中应该都会遇到一些异步的问题,好比咱们必须等请求接口返回数据后才去作另一些事情,咱们都是经过回调函数来作 大部分好的状况是只须要等待一个异步的结果就能够去作一些事情,那么极端的状况是不一样的异步嵌套,让咱们的代码看上去就像一个金字塔,一层层的异步嵌套让咱们头皮发麻,这种状况被咱们称为回调地狱编程

fs.readFile('./sample.txt', 'utf-8', (err, content) => {
    let keyword = content.substring(0, 5);
    db.find(`select * from sample where kw = ${keyword}`, (err, res) => {
        get(`/sampleget?count=${res.length}`, data => {
           console.log(data);
        });
    });
});
复制代码
回调的缺点
  • 嵌套太深,难以维护
  • 有些状况下没法正常使用return和throw
  • 没法正常检索出堆栈信息

promise就能够解决这些问题,可让咱们的代码跟优雅更具备可读性,给promise下个定义axios

promise是异步编程的一种解决方案,比回调函数更何理更强大promise

咱们从使用层面上再来定义如下promise浏览器

  • 主要用于异步计算
  • 能够将异步操做队列化,让程序按照指望的顺序来执行,返回符合预期的结果
  • 能够在对象之间传递和操做promise,帮助咱们处理队列

#####同步和异步 你们都知道同步和异步,可是让你给他下个定义你知道吗?bash

通常而言,操做分为两种发出调用和获得结果,发出调用当即获得结果为同步,发出调用,没法当即获得结果,须要一些额外的操做才能获得预期的结果为异步。同步是在发出调用后一直等待程序是阻塞状态,异步发出调用后程序能够继续执行dom

异步操做的常见用法
  • 事件侦听与响应
dom.addEventListener(type,callback)
$(dom).on(type,callback)
复制代码
  • 在浏览器中异步操做以事件为主

promise的三种状态

  • pendding 实例化时候的状态
  • fullfilled 操做成功后
  • rejected 被否决操做失败 promise实例的后两种状态一经改变后不会再次改变,好比状态改为fullfilled不会在改为rejected

promise的结构

new Promise((resolve,reject)=>{
      //此处执行一段异步代码 (这个部分被称为执行器)
      //异步处理有结果以后执行对应的
      resolve() //操做成功调用此回调,把promise的实例状态改为fullfilled
      reject()   //操做失败调用此回调,把promise的实例状态改为rejected
  }).then((res,rej) => {

})
复制代码

在then函数里返回一个新的promise,then支持两个参数,分别对应上一个promise实例的两个回调 then能够链式的调用,当前面一个promise的状态改变时,后面的then会根据前面一个promise的状态执行对应状态的回调 (这个地方有一个坑 由于须要手动return) 异步

image.png
接用慕课网老师的一张图,看一下整个流程

  • 实例化promise
  • 执行器执行一段异步代码
  • 判断执行成功或者失败分别调用resolve()或者rejected()
  • resolve()或者rejected()改变promise实例的状态
  • 执行then里面的对应promise状态的回调,成功执行res(),失败执行rej()
  • then返回新的promise下一个then会根据新返回来的promise的实例执行对应状态的res()或者rej()

promise是一个代理对象,它和原先的操做并未关系,咱们只须要把原先的操做放入执行器里 它经过一个回调函数,而后把其它的回调所有基于此回调函数异步编程

相关文章
相关标签/搜索