如何在 JavaScript 中等待函数完成

article/2025/11/3 9:04:47

目录

  • JavaScript 中的 Sync 和 Async
  • 在 JavaScript 中使用 回调 来等待一个函数的完成
  • 在 JavaScript 中使用 promises 来等待一个函数的完成
  • 使用 async/await 等待一个函数完成后再继续执行

本教程将介绍 JavaScript回调承诺Async/ await,并告诉你如何等待一个异步函数完成后再继续执行。
要了解什么是 PromisesAsync/ await,我们首先要了解 JavaScript 中的 SyncAsync 函数是什么。

JavaScript 中的 Sync 和 Async

同步编程一次执行一条命令。当我们调用一个函数执行一个长期运行的动作时,它会停止程序,直到它完成。

JavaScript 是传统的单线程,即使是多核也是如此。我们可以让它只在一个叫做主线程的单线程上运行任务。

这样的同步行为是多线程的限制因素,但可以帮助用户编写代码而不用担心并发问题。

而在异步编程中,长期运行的动作会在主线程以外的另一个线程中执行,所以主线程的执行不会被阻塞。当该长期运行的函数完成后,主程序会被告知并获得访问结果。

JavaScript 中的大多数 I/O 基元都是非阻塞的。网络请求、文件系统操作都是非阻塞操作。被阻塞是 JavaScript 中的例外。

由于 JavaScript 是基于异步编程技术,所以有多种方法,如 回调承诺async/await,使你能够把你的函数按顺序执行。这样,一个代码块或一个函数不会在另一个特定函数完成之前被执行。
在这里插入图片描述
上图显示了两个函数异步和同步执行的明显变化。

在 JavaScript 中使用 回调 来等待一个函数的完成

如果我们有同步语句,那么执行这些语句之后就可以直接执行。

function one(){console.log("I am function One");
}
function Two(){console.log("I am function Two");
}one();
Two();

输出:

I am function One
I am function Two

假设我们要执行两个函数,functionOne()functionTwo(),这样 functionOne() 应该在执行完 functionTwo() 里面的一些异步语句后执行。

function functionOne(_callback){// do some asynchronus work _callback();
}function functionTwo(){// do some asynchronus work functionOne(()=>{console.log("I am a callback");});
}functionTwo();

在执行上述代码时,最后在控制台中打印的是 I am a callback。著名的 callback 例子是 setTimeout 函数,在超时后要执行一个处理函数。

function testCallBack(){console.log("log before use setTimeout function");setTimeout(()=>{console.log("inside timeout");},5000);console.log("log after use setTimeout function");
}testCallBack();

输出:

log before use setTimeout function
log after use setTimeout function
inside timeout

在 JavaScript 中使用 promises 来等待一个函数的完成

promise 是一个代表异步操作的最终实现或失败的对象,我们用一个或多个 then 语句将实现回调附加到 promise 上。我们用一个或多个 then 语句将实现回调附加到 promise 上,并在 catch 中调用错误处理回调。

doFirstThing()
.then(result => doSecondThing(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => {console.log("The final result thing"+finalResult);
})
.catch(failureCallbackfunction);
}

像上面的例子一样把 thencatch 语句链起来,是承诺的优势之一。我们承诺一旦 doFirstThing() 被满足,就会 doSecondThing(result)then 的参数是可选的,但如果你必须返回一个结果,则需要。

如果出现错误,浏览器会在链的最后寻找 catch 并执行。这和著名的 try-catch 非常相似。

下面的例子将帮助我们理解 promises 链,并告诉我们如何等待一个具有异步行为的函数完成执行后才能继续执行。

var resolvedFlag = true;let mypromise = function functionOne(testInput){console.log("Entered function");return new Promise((resolve ,reject)=>{setTimeout(()=>{console.log("Inside the promise");if(resolvedFlag==true){resolve("Resolved");}else{reject("Rejected")}     } , 2000);});
};mypromise().then((res)=>{console.log(`The function recieved with value ${res}`)
}).catch((error)=>{console.log(`Handling error as we received ${error}`);
});

输出:

Entered function
Inside the promise
The function received with value Resolved

创建一个承诺可以像返回一个新的 Promise() 一样简单。Promise() 构造函数接收一个函数作为参数,它应该有两个参数-resolvereject

万一我们的事件实现了,需要返回结果,当成功完成我们正在做的事情时,我们使用 resolve() 函数。但如果发生了错误,需要处理,我们使用 reject() 将错误发送到 catch

我们设置标志 resolvedFlag=true 来模拟 catch 中的错误处理。如果 resolvedFlag 设置为 false,则调用 reject() 函数,在 catch 块中处理错误。

输出:

Entered function
Inside the promise
Handling error as we received Rejected

使用 async/await 等待一个函数完成后再继续执行

在 JavaScript 的异步环境中,另一种等待函数执行后再继续执行的方法是使用 async/wait

async 函数是由 async 关键字声明的函数,而在 async 函数内部只允许使用 await 关键字,用于暂停 async 函数内部的进度,直到实现或拒绝基于承诺的异步操作。

asyncawait 关键字以更简洁的风格实现了基于承诺的异步行为。

让我们来了解一下 async/await 是如何工作的。我们要等待的函数应该返回一个 Promise 类的实例,在调用它之前使用 await 关键字等待它执行。如上所述,包含 await 语句的函数必须与 async 语句一起声明。

下面的例子展示了如何等待那个基于承诺的函数完成后再继续执行。

function testAsync(){return new Promise((resolve,reject)=>{//here our function should be implemented setTimeout(()=>{console.log("Hello from inside the testAsync function");resolve();;} , 5000);});
}async function callerFun(){console.log("Caller");await testAsync();console.log("After waiting");
}callerFun();

输出:

Caller
Hello from inside the testAsync function
After waiting


http://chatgpt.dhexx.cn/article/lfhl7NMA.shtml

相关文章

js倒计时(js倒计时5秒)

倒计时69天!大家倒计时多少天了? 我是倒计时90天了,很享受宝宝每天胎动的时间 什么是倒计时载入页面的JS代码? diffSecs timeDiff/1000; //因为时间以毫秒为单位 return(this。diffSecs); //返回间隔秒数} function getSecs() { var mySecs …

js实现5秒后跳转页面

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、使用js代码实现延时跳转二、使用步骤 1.定时器 setInterval2.location跳转3.整体实现总结 提示:以下是本篇文章正文内容,下面案例可供参…

Python+selenium自动化之26----等待

Selenium学习和使用过程中,比较常见的一个问题就是,弹窗定位不到、元素定位不到等,除了页面有frame、多窗口,就是没有加等待。代码运行的速度远远高于浏览器加载的速度,就像双人跑步运动,一个人快一个人慢总…

这一次,彻底弄懂 JavaScript 执行机制

本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码&#x…

JavaScript实现5秒后跳转界面

打开代码&#xff0c;静待5秒后跳转新界面 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&qu…

poi合并单元格后居中

//设置style ICellStyle cellstyle workbook.CreateCellStyle(); cellstyle.VerticalAlignment VerticalAlignment.Center; cellstyle.Alignment HorizontalAlignment.Center; //合并操作 sheet.AddMergedRegion(new CellRangeAddress(index["firstRow"], index…

poi 合并单元格添加边框_如何在Excel中添加和更改单元格边框

poi 合并单元格添加边框 Excel spreadsheets can be hard to read at a glance, thanks to dense information and the grid formatting. Spending a little time on your spreadsheet to make it easier to read is a solid plus, starting with the borders around different…

【问题记录】POI合并单元格导致统计数据不对

说明 最近遇到了一个朋友问我的一个问题&#xff0c;觉得挺有意思的&#xff0c;记录一下。 简单说下背景&#xff0c;她需要在一个系统中导出订单报表&#xff0c;核对下金额&#xff0c;结果是金额对不上。 刚开始第一反应公式不对&#xff0c;检查后发现没毛病。最后猜想可…

poi合并单元格,没有样式

问题如下&#xff1a; 所有单元格的样式都是带边框的&#xff0c;但是合并之后&#xff0c;图中的红框标识区域样式并没有 样式源码如下&#xff1a; public HSSFCellStyle getBorderCellStyle(HSSFWorkbook hWorkbook) {HSSFCellStyle cellStyle hWorkbook.createCellStyle(…

Java POI 合并单元格操作以及代码示例

主要代码 CellRangeAddress oneRange new CellRangeAddress(1, 3,1, 4); // sheet 中合并要合并的单元格地址对象 sheet.addMergedRegion(oneRange);sheet 来源 Workbook wb new XSSFWorkbook(inputStream); Sheet sheet wb.getSheetAt(0);CellRangeAddress(1, 3,1, 4); 中…

POI 合并单元格后设置列宽自适应的问题

POI设置列宽自适应的方法public void autoSizeColumn(int column, boolean useMergedCells);可以看到除了第一个列标参数外&#xff0c;还有第二个useMergedCells的布尔值参数。它的意思是&#xff0c;在进行列宽自适应时&#xff0c;要不要考虑计算已经进行合并的单元格里面的…

java poi 合并单元格 边框显示不全

问题&#xff1a;poi 纵向合并单元格 边框只显示部分。 解决&#xff1a; 我这边先创建合并行&#xff0c;再将两行合并。还需要在第三行中输入内容&#xff0c;就需要 判断第三行是否存在。不然第三行的样式会覆盖合并单元格的样式&#xff0c;导致边框只显示一部分。 还需要…

POI合并单元格设置单元格样式

文章目录 设置居中设置背景颜色设置边框设置字体合并单元格实际使用运行效果 设置居中 CellStyle centerStyle wb.createCellStyle();centerStyle.setAlignment(HorizontalAlignment.CENTER); // 居中centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中设…

java poi 读合并单元格的内容,poi合并单元格,poi合并单元格并设置内容居中

poi合并单元格,poi合并单元格并设置内容居中,Java使用POI操作Excel合并单元格 合并单元格的方法: 指定 4 个参数,起始行,结束行,起始列,结束列。然后这个区域将被合并。 CellRangeAddress region = new CellRangeAddress(startRow, endRow, startCol, endCol); sheet.addM…

Java基于POI动态合并单元格

基于poi动态合并表格 -首先看下效果图 左边为主表数据&#xff0c;右边为子表数据&#xff0c;可以根据自己的需求进行修改&#xff0c;下面来看下代码。 引入依赖 <!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-…

poi 读取excel合并单元格两种方式

说明: excel合并是用选择的两个或更多单元格创建一个单元格的过程。合并单元格时&#xff0c;如果有多个选择的单元格包含数据&#xff0c;则将保留左上角或右上角(取决于当前的视图方向)单元格中的数据&#xff0c;并删除其余的所有数据。 操作方法&#xff1a; 1 首先创建三…

POI 合并单元格

1. 合并单元格概述 合并单元格CellRangeAddress就是将几个相邻的单元格合并为一个单元格&#xff0c;即使没有创建过行和单元格&#xff0c;也 可以创建合并单元格&#xff0c;因为单元格信息是单独存储的 /*** Creates new cell range. base 0* * param firstRow Index of fi…

Java使用POI操作Excel合并单元格

友情链接&#xff1a;Spring Data JPA 动态查询 普通查询 友情链接&#xff1a;利用POI实现动态复杂多级表头 前言 合并单元格语法&#xff1a; 开始行、结束行、开始列、结束列 对应代码&#xff1a;new CellRangeAddress(startRowIndex, rowIndex - 1, i, i); 合并代码…

css动画(旋转)

css动画&#xff08;旋转&#xff09; &#xff08;作者&#xff1a;张米&#xff0c;撰写时间&#xff1a;2019年2月4号&#xff09; 旋转函数rotate(n)通过指定的角度参数使元素围绕原点旋转。n是角度参数&#xff0c;用于设置参数的大小&#xff0c;参数单位是deg。参数为正…

CSS - 元素旋转动画(360度转圈)

效果图 代码 keyframes rotate {0%{-webkit-transform:rotate(0deg);}25%{-webkit-transform:rotate(90deg);}50%{-webkit-transform:rotate(180deg);}75%{-webkit-transform:rotate(270deg);}100%{-webkit-transform:rotate(360deg);} }使用 /* turn : 定义的动画名称1s : 动…