promise和async await区别是什么
发布时间:2025-05-24 01:44:21 发布人:远客网络
一、promise和async await区别是什么
使用async/await能省去写多少行代码。
async/wait能用相同的结构和好用的经典try/catch处理同步和异步错误,错误堆栈能指出包含错误的函数。
async/await的一个极大优势是它更容易调试,使用async/await则无需过多箭头函数,并且能像正常的同步调用一样直接跨过await调用。
Async await进一步优化了Promise的缺点,使代码更简洁。
函数前使用关键字async,await只能用在async标记的函数内。比promise更简洁处理结果上:promise需要使用.then()来处理promise返回的结果,而async/await则直接在代码上顺序处理结果。
promise的诞生是为了简化函数嵌套调用流程,也便于后续维护。
async/await定义了异步函数,并在其内部可通过await等待promise对象,阻塞后续的执行。
二、Node.js如何对SQLite的async/await封装详解
本文主要给大家介绍的是关于Node.js对SQLite的async/await封装的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
用于将每个SQLite函数同步化,并可以用await的接口。
注意:需要SQLite for Node模块和Node.js 8.0+,并支持async/ await。
SQLite最常用作本地或移动应用程序的存储单元,当需要从程序的各个部分访问数据时,回调不是最佳解决方案。
为了在程序程序中更自然地访问数据,我编写了一个将回调转换为promises的接口,因此我们可以将每个函数与await关键字一起使用。它不是异步函数的替代品,它是一个补充,可以将原始函数和同步函数一起使用。
SQLite的接口是一个名为aa-sqlite的模块,您必须将其存储在应用程序的node_modules部分中。这是完整的源代码
const sqlite3= require('sqlite3').verbose()
return new Promise(function(resolve){
this.db= new sqlite3.Database(path,
if(err) reject("Open error:"+ err.message)
// any query: insert/delete/update
return new Promise(function(resolve, reject){
exports.get=function(query, params){
return new Promise(function(resolve, reject){
this.db.get(query, params, function(err, row){
if(err) reject("Read error:"+ err.message)
exports.all=function(query, params){
return new Promise(function(resolve, reject){
if(params== undefined) params=[]
this.db.all(query, params, function(err, rows){
if(err) reject("Read error:"+ err.message)
// each row returned one by one
exports.each=function(query, params, action){
return new Promise(function(resolve, reject){
db.each(query, params, function(err, row){
if(err) reject("Read error:"+ err.message)
db.get("", function(err, row){
return new Promise(function(resolve, reject){
下面的示例展示了aa-sqlite的每个功能的示例。在第一部分中,我们打开一个数据库,添加一个表并用一些行填充该表。然后关闭数据库,我们再次打开它并执行一些同步查询。
const sqlite= require("aa-sqlite")
console.log(await sqlite.open('./users.db'))
var r= await sqlite.run('CREATE TABLE users(ID integer NOT NULL PRIMARY KEY, name text, city text)')
if(r) console.log("Table created")
var entry= `'${id}','${x}','${users[x]}'`
var sql="INSERT INTO users(ID, name, city) VALUES("+ entry+")"
if(r) console.log("Inserted.")
// Starting a new cycle to access the data
await sqlite.open('./users.db')
console.log("Select one user:")
var sql="SELECT ID, name, city FROM users WHERE name='Naomi'"
console.log("Read:", r.ID, r.name, r.city)
console.log("Get all users:")
console.log("Read:", row.ID, row.name, row.city)
console.log("Get some users:")
sql="SELECT* FROM users WHERE name=?"
r= await sqlite.all(sql, ['Amy'])
console.log("Read:", row.ID, row.name, row.city)
r= await sqlite.each(sql, [], function(row){
console.log("Read:", row.ID, row.name, row.city)
由于all方法返回一个row数组,我们使用forEach来处理每一行的内容。
你可以在每个方法的情况下进行验证,即在程序显示“完成”之前处理返回的每一行。原始异步方法不会出现这种情况。
参考并翻译自:
三、如何使用 await-to-js 库优雅的处理 async await 错误
1、通过阅读优秀的源码并从中学习如何写出赏心悦目的代码,最后再撰写文章进行总结,梳理整个学习过程并分享给他人。
2、在 JavaScript异步编程的进化之路上,我们先回顾了回调地狱阶段的困境。那时,前端开发者常面对着令人头痛的纵向和横向嵌套的回调,代码可读性和维护性极低。
3、随后,Promise出现并解决了这一问题。Promise提供了链式调用的能力,使得代码仅在纵向发展。它允许并发请求并支持错误处理,相较于回调地狱大大提升了代码的优雅性。
4、然而,Promise的不足之处依然存在,特别是在处理多个异步操作时,仍然需要使用 try-catch结构处理错误。为了解决这一问题,async/await应运而生。它简化了异步代码的编写,并提供了更简洁、易于理解的错误处理方式。
5、await-to-js库为解决 async/await的错误处理问题提供了一个简单而优雅的解决方案。它允许开发者无需使用 try-catch结构即可轻松处理异步操作的错误,从而进一步简化了代码。
6、await-to-js的核心逻辑由仅15行代码组成。它通过将错误处理逻辑封装在一个包装器中,使得开发者可以更便捷地处理异步操作产生的错误,而无需编写冗长的 try-catch语句。
7、通过分析源码,我们可以看出,await-to-js的实现并不依赖于神秘的“黑魔法”,而是通过简洁的代码逻辑实现了目标。源码中的 errorExt参数允许开发者自定义错误信息,进一步增强了库的灵活性。
8、综上所述,通过学习优秀的源码、理解异步编程的演进过程、掌握 Promise和 async/await的用法,以及借助库如 await-to-js的帮助,我们可以写出更加优雅、易于维护的 JavaScript异步代码。这些库和工具的出现,为开发者提供了更高效、简洁的解决方案,帮助我们更好地应对异步编程的挑战。