内容简介:在ES6语法出现之前,如果想要若干个异步过程按顺序执行,则需要使用回调嵌套,比如这里有个step函数,执行需要一定的时间:如果想要执行两次step,并且必须按顺序个条一条执行,在以前一般要使用回调嵌套:在ES6语法中,可以通过async/await将上面的回调函数按顺序执行。
回调嵌套
在ES6语法出现之前,如果想要若干个异步过程按顺序执行,则需要使用回调嵌套,比如这里有个step函数,执行需要一定的时间:
var step = function(isError, cb) {
setTimeout(function() {
console.log(new Date())
cb && cb(isError && new Error('step Error'), isError)
}, 1000)
}
如果想要执行两次step,并且必须按顺序个条一条执行,在以前一般要使用回调嵌套:
var test = function() {
step(0, function(err, isError1) {
if (err) {
console.log(err)
}
step(0, function(err, isError2) {
if (err) {
console.log(err)
}
})
})
}
用async/await
在ES6语法中,可以通过async/await将上面的回调函数按顺序执行。
首先将原来的方法 promisify 化,引用 util 库将 step 函数即可:
const util = require('util')
var stepAsync = util.promisify(step)
然后用 async/await 顺序执行,注意 await 只能在 async 函数中使用
var test = async function() {
let result1 = await stepAsync(0)
let result2 = await stepAsync(0)
console.log(result1, result2)
}
test()
结果:
2020-02-18T07:54:01.081Z 2020-02-18T07:54:01.081Z 0 0
其实 util.promisify 只是将函数封装成了Promise对象,实现并不复杂,不过使用promisify有两个前提条件
1. Error first 原则: 即你在调用回调函数时,第一个必须为error
2. Callback last 原则: 即在往函数传参数时,最后一个参数是回调函数
异常处理
在 async/await 中使用 try/ catch 捕获处理异常
var test = async function() {
try {
let result1 = await stepAsync(0)
let result2 = await stepAsync(1)
console.log(result1, result2)
} catch(e) {
console.log(e)
}
}
test()
结果:
2020-02-18T07:54:01.081Z 2020-02-18T07:54:01.081Z Error: step Error at Timeout._onTimeout (testAwait.js:59:25) at ontimeout (timers.js:475:11) at tryOnTimeout (timers.js:310:5) at Timer.listOnTimeout (timers.js:270:5)
多参数返回
估计大家已经看到了,类似这样的调用,只能接收一个参数:
let result1 = await stepAsync(0)
目前在JavaScript还没有一种语法可以在一行语法中同时给两个变量分别赋值,期待在以后的JS版本里有所改进。所以如果你的方法中要返回一个以上的参数,可以将其变成成数组或对象:
比如,下面是使用数组返回的例子:
var step = function(isError, cb) {
setTimeout(function() {
console.log(new Date())
cb && cb(isError && new Error('step Error'), [ isError, Date.now() ])
}, 1000)
}
var stepAsync = util.promisify(step)
var test = async function() {
try {
let [ result1, time1 ] = await stepAsync(0)
let [ result2, time2 ] = await stepAsync(0)
console.log(result1, time1, result2, time2)
} catch(e) {
console.log(e)
}
}
test()
执行:
$ node testAwait.js 2020-02-18T08:10:31.328Z 2020-02-18T08:10:32.365Z 0 1582013431334 0 1582013432365
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Node.JS中回调嵌套和async/await执行空函数性能效率对比测试
- [OC] 关于block回调、高阶函数“回调再调用”及项目实践
- 即使回调IsOneWay,WCF客户端也会因回调而死锁
- Java 回调机制解读
- 如何避免回调地狱
- 如何使用JPA回调?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法设计、分析与实现
徐子珊 / 2012-10 / 65.00元
《算法设计、分析与实现:c、c++和java》由徐子珊编著,第1章~第6章按算法设计技巧分成渐增型算法、分治算法、动态规划算法、贪婪算法、回溯算法和图的搜索算法。每章针对一些经典问题给出解决问题的算法,并分析算法的时间复杂度。这样对于初学者来说,按照算法的设计方法划分,算法思想的阐述比较集中,有利于快速入门理解算法的精髓所在。一旦具备了算法设计的基本方法,按应用领域划分专题深入学习,读者可以结合已......一起来看看 《算法设计、分析与实现》 这本书的介绍吧!