美文网首页
深入理解Promise对象

深入理解Promise对象

作者: A郑家庆 | 来源:发表于2019-02-21 12:12 被阅读0次

概念

  所谓Promise简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上来说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

捕获错误

  如果不设置回调函数,Promise内部抛出的错误不会反应到外部,所以才有catch方法或者用then第二个回调函数都可以捕获Promise内部错误。还有一种情况是在Promise函数体外抛出的,会冒泡到最外层,成了未捕获的错误,会被浏览器打印出来。需要注意的是,catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法。

Promise.all()

  Promise.all方法用于将多个Promise实例包装成一个新的Promise实例。

let p = Promise.all([p1, p2, p3])

p1,p2,p3都是Promise实例,如果不是就会调用Promise.resolve()方法,将参数转为Promise实例,再做进一步处理。Promise.all的参数是数组或具有Iterator接口的数据。

Promise由来

Promise是为了解决回调函数嵌套问题而提出的。它不是新的语法功能,而是一种新的写法,允许将回调函数的嵌套改写成链式调用。假定读取多个文件,普通回调函数写法如下:

fs.readFile(fileA, function (err, data) {
     fs.readFile(fileB, function (err, data) {
          // ...
     })
})

Promise写法:

let readFile = require('fs-readFile-promise')

readFile(fileA).then(function (data) {
    console.log(data.toString())
})
.then(function () {
    return readFile(fileB)
})
.then(function (data) {
    console.log(data.toString())
})
.catch(function(err) {
    console.log(err)
})

上面代码已经把回调函数改成了直线执行的形式,但是加入了大量Promise的语法。Generator函数可以进一步改善代码运行流程。
Generator写法:

function * longTask (value1) {
    try {
      let value2 = yield step1(value1)
      let value3 = yield step2(value2)
    } catch (e) {
       // ....
    }
}
scheduler (longTask(initiaValue))
function scheduler (task) {
    let taskObj = task.next(task.value)
    // 如果未结束,就继续调用
    if (!taskObj.done) {
         task.value = taskObj.value
         scheduler (task)
    }
}

以上是Generator函数同步写法,如果用异步写法需要用Thunk函数,Thunk函数是自动执行Generator函数的一种方法。co模块是在Thunk函数基础上进一步优化自动执行Generator函数的一种方法。
Iterator接口为不同的数据结构提供了统一的访问机制,Generator函数是一种具有Iterator接口的数据。所以它才需要调用next()方法才能返回里面的元素。

不管是Promise、Generator函数、async函数都是为了优化回调函数,回调函数是用来解决异步请求后台的问题,异步是为了解决页面卡顿的问题,js执行机制。
异步---回调函数----Promise---Generator函数---async函数
看一下js执行机制,Event Loop,然后一步一步延伸。
async函数是Generator函数的语法糖。

相关文章

  • Promise用法详解

    参考promise|深入理解 promise:promise的三种状态与链式调用 Promise对象只有三种状态 ...

  • 深入理解Promise对象

    概念   所谓Promise简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从...

  • Promise原理解析

    Promise原理解析 标签(空格分隔): Node.js Promise原理解析 简介 Promise 对象用于...

  • Promise对象原理解析

    Promise对象原理解析 ES6 原生提供了 Promise 对象。所谓 Promise,就是一个对象,用来传递...

  • async await Promise

    深入理解 async await Promise Promise.all() 问题:await 一个 async ...

  • JS异步处理系列一 ES6 Promise

    参考深入理解 Promise 五部曲 -- 1.异步问题深入理解 Promise 五部曲 -- 2.控制权转换问题...

  • 手写Promise

    手写 Promise 我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写...

  • Promise深入理解

    JS异步处理 众所周知,JS是一门单线程的语言,即每次只能处理一个任务。这样导致的结果就是在处理一些耗时比较长的任...

  • 深入理解Promise

    所有对外调用的异步节接口,都可以使用Promise,像文件读写,网络请求,数据库操作等,都可以使用Promise。...

  • 深入理解Promise

    目录: 1.概述 2.基本用法2.1 创建Promise2.2 then方法2.3 catch方法2.4 其他创建...

网友评论

      本文标题:深入理解Promise对象

      本文链接:https://www.haomeiwen.com/subject/woilyqtx.html