promise

promise是什么

官网解释 promise 表示一个异步操作的最终结果。

翻译 ==可以将promise理解为一个状态机==,它存在三种不同的状态,并在某一时刻只能有一种状态

  • pending 表示还在执行
  • resolved 执行成功
  • rejected 执行失败

一个promise是对一个异步操作的封装,异步操作有等待完成、成功和失败三种可能的结果,对应了promise的三种状态。

promise的状态只能有pending转换位resolved或者pending转换为rejected,一旦状态转化完成就无法再改变。

假设我们用promise封了一个异步操作,那么当它被创建的时候就处于pending状态,当异步操作成功完成时, 我们将状态转换为resolved,如果执行中出现错误,将状态转换为rejected。

var promise=new Promise(function(resolve,reject){// codeif(){/*异步操作成功 */resolve(value)}else{reject(error)}
})
复制代码
使用then方法获取结果
var fs=require('fs')
function readFile_promise(path){return new Promise(function(resolve,reject){fs.readFile(path, 'utf-8',function(err,data){if(data){resolve(data)}else{reject(err)}})})
}var result=readFile_promise('./1.txt')
result.then(function(value){//successconsole.log('success', value)
},function(error){//failureconsole.log('failure',error)
})
// 将一个异步函数封装成promise,只要在回调函数中针对不同的返回结果调用resolve或者reject方法。// resolve函数会在异步操作成功完成时被调用,并将异步操作的返回值作为参数传递到外部。
// reject是在异步操作出现异常时被调用,会将错误信息作为参数传递出去。
复制代码
then方法的返回值

then方法总是返回一个新的promise对象,多次调用then方法,默认返回一个一个空的promise对象 使用return来来返回。

var promise=readFile_promise('./foo.txt')
promise.then(function(value){//successconsole.log('success', value) // fooreturn readFile_promise('./bar.txt')
},function(error){//failureconsole.log('failure',error)
}).then(function(value){console.log('then', value) // bar
})
复制代码
promise的执行
  • 虽然我们是通过then方法来获取promise的结果,但是promise是当then方法调用之后才执行吗?
var promise=new Promise((resolve, reject)=>{console.log('begin')resolve()
})setTimeout(()=>{promise.then(()=>{console.log('end')})
},5000)
// 开始begin 5s后end
// 运行顺序是,当promise从被创建的那一刻起就开始执行了,then方法只是提供了访问promise状态的接口,与promise的执行无关。
复制代码
promise 常用的api
  • resolved
  • rejected
  • all
  • race 方法接收一个promise数组作为参数并返回一个新的promise,数组中的promise会同时开始执行,race返回的promise的状态有数组中率先执行完毕的promise的状态决定
  • catch 执行出错可以使用throw关键字抛出错误,并使用catch方法进行捕获
 // 如果有多个promise需要执行,可以使用promise.all()
// 方法统一声明,改方法可以将多个promise对象包装成一个promise
// 该方法接收一个数组作为参数,数据的元素如果不是promise对象,则回先调用resolve方法转换。
//  如果中间有一个promise状态是reject,那么转换后的promise也会变成reject,并且将错误信息传给catch方法
var promises=['foo.txt','bar.txt','baz.txt']
promises.map(function(path){// console.log(path)return readFile_promise(path)
})Promise.all(promises).then(function(results){console.log(results) // [ 'foo.txt', 'bar.txt', 'baz.txt' ] 顺序排列的
}).catch(function(err){//
})
复制代码
使用promise组织异步代码
// 例子; 有三个文本文件需要顺序读取
var lists=['foo.txt','bar.txt','baz.txt']
var count=0;
readFile_promise('foo.txt').then(readCB).then(readCB).then(readCB);function readCB(data){console.log(data) // foo bar bazif(++count>2){return}return readFile_promise(lists[count])
}
复制代码

async/await

await关键字后面往往是一个promise,如果不是就隐式调用promise.resolve来转换成一个promise。 await 等待后面的promise执行完成再进行下一步操作。

var asyncReadFile=async function(){var result1=await readFile_promise('./foo.txt')console.log(result1.toString()) // foo
}
asyncReadFile()
复制代码
async返回值

async函数总是会返回一个promise对象,如果return关键字后面不是一个promise,那么默认 调用promise。resolve方法进行转换。

async function asyncFunc(){return 'hello Node'
}
asyncFunc().then(function(data){console.log(data) // hello Node
})
复制代码
async函数的执行过程
  1. 在async函数开始执行的时候回自动生成一个promise对象。
  2. 当方法体开始执行后,如果遇到return关键字或者throw关键字,执行会立刻退出, 如果遇到await关键字则回暂停执行 await后面的异步操作结束后会恢复执行
  3. 执行完毕,返回一个promise
async function asyncFunc(){console.log('begin')return 'hello Node'
}
asyncFunc().then(function(data){console.log(data) // hello Nodeconsole.log('end')
})
// begin
// hello
// end
复制代码
await

await 操作符的结果是由其后面promise对象的操作结果来决定的,如果后面promise对象变为resolved, await操作符发返回的值就是resolve的值;如果promise对象的状态变成rejected,那么await也会抛出reject的值。

async function readFile(){var result=await readFile_promise('./foo.txt')console.log(result) // foo
}
readFile()// 等价于
readFile_promise('foo.txt').then(function(data){console.log(data) // foo
})
复制代码
await于并行

await会等待后面的promise完成后再采取下一步动作,这意味着当多个await操作时,程序会便成完全的 串行操作。

当异步操作之间不存在依赖关系时,可以使用promise.all来实现并行。

async function readFile(){const [result1, result2]=await Promise.all([readFile_promise('./foo.txt'),readFile_promise('./bar.txt')])console.log(result1, result2) // foo bar
}
readFile()// 等价于
function readFile(){return Promise.all([readFile_promise('./foo.txt'),readFile_promise('./baz.txt')]).then((result)=>{console.log(result) // [ 'foo', 'baz' ]})
}
readFile()
复制代码

await 总结

await关键字使用的一些关键点

  • await关键字必须位于async函数内部
  • await关键字后面需要是一个promise对象(不是的话就调用了resolve转换的)
  • await关键字的返回结果就是在其后面promise执行的结果,可能是resolved或者rejected的值
  • 不能在普通箭头函数中使用await关键字,需要在箭头函数前面加上async关键字。
  • await用来串行地执行异步操作,想实现并行使用promise.all

async函数 的缺点

  • 假设我们有很多层的方法调用,最底层的异步操作被封装成了async方法,那么该函数的所有上层方法可能都要变成async方法。

转载于:https://juejin.im/post/5c57ffe16fb9a049e4132557

promise是什么相关推荐

  1. setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)

    本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...

  2. C++多线程:异步操作std::async和std::promise

    文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...

  3. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  4. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...

  5. promise实现多个请求并行串行执行

    早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...

  6. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  7. 自己动手写cpu pdf_自己动手写 Promise

    这段时间在学习Promise,但始终不得要领.为了更好地理解Promise,我决定自己实现一个简易版的Promise,以学习Promise工作原理.该工程名为ToyPromise,仓库地址如下: ht ...

  8. promise 和 async await区别

     什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...

  9. Promise - js异步控制神器

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 首先给来一个简单的demo看看Promise是怎么使用的: <!DOCTYPE html> ...

  10. Promise的实例用法

    设定函数 function chiFan() {return new Promise(function(resolve, reject) {console.log("chiFan" ...

最新文章

  1. 【c语言】蓝桥杯基础练习 01字串
  2. OpenStack Swift源码安装
  3. 剑指offer之重建二叉树
  4. oracle sql语句 exists
  5. Vue 项目调试总结
  6. 飞思卡尔单片机c语言编程详解,飞思卡尔单片机PIT汇编编程(一)
  7. 当自己觉得特别迷茫的时候,是怎么走出这个困境的
  8. ACM2023SWJTU寒假选拔赛2不完全题解
  9. 计算机硬件系统一直延用,会计电算化计算机硬件系统
  10. 【转】右键菜单大揭密
  11. 把微信做成找券机器人,淘宝查券返利小助手实现方法分享
  12. 串口——同时打开两个串口
  13. 计算机桌面无法中英文切换,Win10输入法中英文切换不了怎么办?
  14. 聚类标准误(cluster standard errors)是什么,什么情况下需要聚类,控制了固定效应(fixed effect)还需要聚类吗?
  15. 微光医疗/软件测试工程师实习面试
  16. 平安金融卫士 互联网理财“安全第一”
  17. Java 8 新特性之 Stream 流(五)映射
  18. 记Global Protect安装的一次坑旅
  19. 移动端微信接收到CAD图纸,如何打开?
  20. 数据结构导论——总结

热门文章

  1. select语句(3)--单值函数
  2. 读书笔记(二十三):代码整洁
  3. Word中批量更新域的两个小方法
  4. OpenCV学习常用网址
  5. nian shi ti是什么鬼????
  6. Spring系列之依赖注入的三种方式
  7. 【每日一题】JVM篇-年轻代到年老代的晋升过程的判断条件是什么呢
  8. Python基础知识-pycharm版-02
  9. mac nexus 资源下载及安装
  10. cf Round#779 D 388535