聊聊Promise的那些事

Promise是什么?

Promise从含义上讲,它是一个异步操作的解决方案,从语法本质上讲,它就是一个构造函数,函数内部是要进行的异步操作,它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promise。
下面给出一个Promise的使用场景:使用Promise对象,给定一个文件路径,去读取文件的内容

const fs = require('fs')
function getFileByPath(fpath) {
    return new Promise(function(resolve, reject) {
        fs.readFile(fpath, 'utf-8', (err, dataStr) => {
            if (err) return reject(err)
            resolve(dataStr)
        })
    })
    return promise
}
//调用
getFileByPath('./files/2.txt').then(function(data) {
    console.log(data + '--------')
}, function(err) {
    console.log(err.message)
})

读取文件在js里面需要异步操作,因为js是单线程执行环境,如果这个操作不使用异步,程序就得等待读文件操作结束后,才能执行下一个任务,这样会增加页面的响应时间,从而带来较差的用户体验。
Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve 方法和 reject 方法。在Promise对象创建的时候,resolve和reject两个方法作为形参传入Promise对象的函数中。
我们可以通过Promise对象.then()来指定promise对象的resolved状态rejected的状态。
如果异步操作成功,则用 resolve 方法将 Promise 对象的状态,从「未完成」变为「成功」(即从 pending 变为 resolved);
如果异步操作失败,则用 reject 方法将 Promise 对象的状态,从「未完成」变为「失败」(即从 pending 变为 rejected)。
上面代码中的resolve方法在调用时指的是:
function(data) {
console.log(data + '--------')
}
reject方法在调用中指的是:
function(err) {
console.log(err.message)
}

为什么要用Promise?

这时有人可能就会说,异步操作为什么要用Promise,用回调函数或者事件机制不也能够实现异步,那我们来看下面这个用回调函数实现的异步场景:


getFileByPath('./files/1.txt').then(function(data) {
        console.log(data)
        getFileByPath('./files/2.txt').then(function(data){
            console.log(data);
            getFileByPath('./files/3.txt').then(function(data){
            console.log(data);
            ...
            } 
        }
    }

当更多的文件请求被回调时,代码结构上就会变得难以理解,称它为回调地狱。
这是我们可以用Promise来解决这个问题,并让我们的代码变得简洁易懂:

getFileByPath('./files/1.txt')
    .then(function(data) {
        console.log(data)
        return getFileByPath('./files/2.txt') //通过return一个新的Promise对象
    }
    .then(function(data) {
        console.log(data)
        return getFileByPath('./files/3.txt')
    })
    .then(function(data) {
        console.log(data)
    })

//在上一个.then中,返回一个新的promise实例,可以继续用下一个.then来处理
这样写的优点在于回调函数变成了链式写法,程序的流程可以看得很清楚,理解起来也更加方便。
当然,这只是Promise的一个好处,还有其他的好处菜鸟飞还需要继续学习。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • title: promise总结 总结在前 前言 下文类似 Promise#then、Promise#resolv...
    JyLie阅读 14,215评论 1 21
  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 12,795评论 1 56
  • Prepending(进行时),Resolve(成功了),Reject(失败了),then......等 1.Pr...
    _菩提本无树_阅读 49,351评论 0 21
  • 前言 本文旨在简单讲解一下javascript中的Promise对象的概念,特性与简单的使用方法。并在文末会附上一...
    _暮雨清秋_阅读 6,666评论 0 3
  • (一) 这是搬迁后第一次回小屋看望,想起来自从红砖青瓦的新屋建好后,已有几年光景不曾来过这黄土灰瓦的小屋了。 沿着...
    欧小一阅读 3,398评论 0 0

友情链接更多精彩内容