您当前的位置:首页 > 互联网教程

promise和async await区别是什么

发布时间:2025-05-24 01:44:21    发布人:远客网络

promise和async await区别是什么

一、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异步代码。这些库和工具的出现,为开发者提供了更高效、简洁的解决方案,帮助我们更好地应对异步编程的挑战。