promise是啥?如何用?
本篇文章给大家带来的内容是关于Laravel多态关联的介绍(附代码),有必然的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。
promise是啥
官网说明 promise 表示一个异步操纵的终究结果。
翻译 ==可以将promise懂得为一个状态机==,它存在三种不一样的状态,并在某一时刻只能有一种状态
pending 表示还在施行resolved 施行成功rejected 施行失败
一个promise是对一个异步操纵的封装,异步操纵有等候完成、成功和失败三种大概的结果,对应了promise的三种状态。
promise的状态只能有pending转换位resolved或者pending转换为rejected,一旦状态转化完成就没法再改动。
假设我们用promise封了一个异步操纵,那么当它被创立的时候就处于pending状态,当异步操纵成功完成时,
我们将状态转换为resolved,假如施行中显现错误,将状态转换为rejected。
var promise=new Promise(function(resolve,reject){ // code if(){ /*异步操纵成功 */ 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){ //success console.log('success', value) },function(error){ //failure console.log('failure',error) }) // 将一个异步函数封装成promise,只要在回调函数中针对不一样的返回结果调取resolve或者reject办法。 // resolve函数会在异步操纵成功完成时被调取,并将异步操纵的返回值作为参数传递到外部。 // reject是在异步操纵显现非常时被调取,会将错误信息作为参数传递出去。
then办法的返回值
then办法总是返回一个新的promise对象,屡次调取then办法,默许返回一个一个空的promise对象
使用return来来返回。
var promise=readFile_promise('./foo.txt') promise.then(function(value){ //success console.log('success', value) // foo return readFile_promise('./bar.txt') },function(error){ //failure console.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 baz if(++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函数的施行历程
- 在async函数开端施行的时候回主动生成一个promise对象。
- 当办法体开端施行后,假如碰到return关键字或者throw关键字,施行会立即退出,
假如碰到await关键字则回暂停施行 await后面的异步操纵完毕后会复原施行
- 施行完毕,返回一个promise
async function asyncFunc(){ console.log('begin') return 'hello Node' } asyncFunc().then(function(data){ console.log(data) // hello Node console.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办法。本篇文章到这里就已经全部完毕了,更多其他出色内容可以关注PHP中文网的JavaScript视频教程栏目!
以上就是promise是啥?如何用?的具体内容,更多请关注百分百源码网其它相关文章!