详细介绍JavaScript中Promise的基本概念及使用方法
本篇文章给大家带来了关于javascript的相关知识,其中主要整理了Promise的基本概念及使用方法的相关问题,包括了Promise基本概念、使用Promise解决回调地狱等等内容,下面一起来看一下,希望对大家有帮助。
【相关推荐:javascript视频教程、web前端】
一、前言
异步是为了提高CPU的占用率,让其始终处于忙碌状态。
有些操作(最典型的就是I/O)本身不需要CPU参与,而且非常耗时,如果不使用异步就会形成阻塞状态,CPU空转,页面卡死。
在异步环境下发生I/O操作,CPU就把I/O工作扔一边(此时I/O由其他控制器接手,仍然在数据传输),然后处理下一个任务,等I/O操作完成后通知CPU(回调就是一种通知方式)回来干活。
《JavaScript异步与回调》想要表达的核心内容是,异步工作的具体结束时间是不确定的,为了准确的在异步工作完成后进行后继的处理,就需要向异步函数中传入一个回调,从而在完成工作后继续下面的任务。
虽然回调可以非常简单的实现异步,但是却会由于多重嵌套形成回调地狱。避免回调地狱就需要解嵌套,将嵌套编程改为线性编程。
Promise
是JavaScript
中处理回调地狱最优解法。
二、Promise基本概念
Promise
可以翻译为“承诺”,我们可以通过把异步工作封装称一个Promise
,也就是做出一个承诺,承诺在异步工作结束后给出明确的信号!
Promise
语法:
let promise = new Promise(function(resolve,reject){ // 异步工作})
通过以上语法,我们就可以把异步工作封装成一个Promise
。在创建Promise
时传入的函数就是处理异步工作的方法,又被称为executor
(执行者)。
resolve
和reject
是由JavaScript
自身提供的回调函数,当executor
执行完了任务就可以调用:
resolve(result)
——如果成功完成,并返回结果result
;reject(error)
——如果执行是失败并产生error
;
executor
会在Promise
创建完成后立即自动执行,其执行状态会改变Promise
内部属性的状态:
state
——最初是pending
,然后在resolve
被调用后转为fulfilled
,或者在reject
被调用时变为rejected
;result
——最初时undefined
,然后在resolve(value)
被调用后变为value
,或者在reject
被调用后变为error
;
2.1 异步工作的封装
文件模块的fs.readFile
就是一个异步函数,我们可以通过在executor
中执行文件读取操作,从而实现对异步工作的封装。
以下代码封装了fs.readFile
函数,并使用resolve(data)
处理成功结果,使用reject(err)
处理失败的结果。
代码如下:
let promise = new Promise((resolve, reject) => { fs.readFile('1.txt', (err, data) => { console.log('读取1.txt') if (err) reject(err) resolve(data) })})
如果我们执行这段代码,就会输出“读取1.txt”字样,证明在创建Promise
后立刻就执行了文件读取操作。