当前位置: 首页 > news >正文

JavaScript 中的Promise 函数

JavaScript 中的Promise 函数

目录

  • JavaScript 中的Promise 函数
    • 1 创建Promise
    • 2 Promise的方法
    • 3 Promises的状态
    • 4 Promise的使用
    • 5 返回 Promise 类型
    • 6 Promise级联使用

  在现在的前端开发中我们常常会使用到 JavaScript Promise 函数,但是很多人都不能正确理解Promise 的是什么,只是听说过Promise 这个词。我们将通过下面的简单例子与一些实例代码来解释一下Promise,样大家能更好的理解。在学习Promise的时候,往往会和同步、异步等词一起出现。很多初学JavaScript的人,因为他们不理解异步和同步,导致了它们同时也不能正确理解Promise原理。现在如果想正确理解Promises,那么我们最好暂时先忘记同步/异步这些词语再来理解Promise,你会发现 Promise 本身非常简单。

让我们通过下面的例子来理解 Promise 是什么。我明天预约了一个位客户来公司洽谈业务,客户承诺明天会来我们公司。但是实际明天回有两个结果,1 是客户信守诺言来到我们公司,2 是客户因为其他事情没有兑现承诺来拜访我们公司。这个例子很好的表达了Promise函数的两种结果,遵守承诺的结果(this在Promise中resolved)和不遵守承诺的结果(this在Promise中rejected)。Promise函数最基础的规则就是在遵守承诺或者不遵守承诺的结果中一定会返回一种结果,可以总结为 “一个Promise会有两个结果并返回其中一个结果”。

1 创建Promise

​  “一个Promise会有两个结果并返回其中一个结果”这句话是什么意思呢?现在我们来使用Promise的代码来解释它。首先使用 new 运算符实例化 Promise 对象并将其分配给变量 zhtuser。

let zhtuser = new Promise()

一个标准的Promise 的函数中包含两个回调函数 resolve 和 reject。

let zhtuser = new Promise(function(resolve,reject){//业务处理内容
})

  在定义resolve 和 reject两个回调函数的业务代码,如果遵守承诺执行 resolve 函数中的逻辑,如果不遵守则将值执行 reject 中的业务逻辑。

const is_promise = true
const zhtuser = new Promise(function(resolve,reject){if (is_promise){resolve('客户来了')} else {reject('客户没有来')}  
})

  这就是编写一个 Promises 函数的主要内容。Promises 函数根据 is_promise的值来决定返回 resolve 或 reject 的值。我们还可以使用函数编写的方式来写自定义的Promise函数调用 resolve 和 reject 。

const is_promise = true
const zhtuser = function (){return new Promise(function(resolve,reject){if (is_promise){resolve('客户来了')} else {reject('客户没有来')}  })
}
==========  javasrcipt函数  ============
function zhtuser() {return new Promise(function(resolve,reject){if (is_promise){resolve('客户来了')} else {reject('客户没有来')}  })
}

2 Promise的方法

  现在我们知道了如何创建一个Promise 承诺函数,那么我们如何来操作Promise函数?这时需要使用到 then方法,来帮助我们在zhtuser对象中获得Promise resolve 的结果。

  • then 承诺完成
  • catch 没有完成承诺

Then方法中包含了一个函数,这个函数的参数就是 resolve 的结果。

const is_promise = true
const zhtuser = new Promise(function(resolve,reject){if (is_promise){resolve('客户来了')} else {reject('客户没有来')}  
})
//执行获得resolve函数结果
zhtuser.then(function(comment){alert(comment)
})

回调resolve函数中的参数现在是字符串,它也可以是对象,数组,或者是所有javascript对象类型。现在让我们看看将一个数组放入 resolve 会发生什么。

const is_promise = true
const zhtuser = new Promise(function(resolve,reject){if (is_promise){resolve(['a','b','c',1,2,3])} else {reject('客户没有来')}  
})
zhtuser.then(function(comment){alert(comment)
})

我们使用then方法同样可以获得到数组内容。

[ 'a', 'b', 'c',1,2,3]

如果未遵守承诺(is_promise= false),我们将如何获取 reject 中的值。

**如果is_promise= false,使用 catch 而不是 then 来获取 reject 的值。**这样可以根据结果进行不同的业务处理,如果遵守诺言则在 then 中执行业务代码,如果不遵守诺言则在 catch 中执行业务代码。

const is_promise = false
const zhtuser = new Promise(function(resolve,reject){if (is_promise){resolve(['a','b','c',1,2,3])} else {reject('客户没有来')}  
})
//业务执行
zhtuser.then(function(comment){alert(comment)//如果没有遵守承诺获得 reject 中的值   
}).catch(function(comment){alert(comment)
})

我开发的时候通常会直接使用catch方法,但是你也可以在then中放入两个函数,不需要使用catch方法也可以得到reject值。

const is_promise = false
const zhtuser = new Promise(function(resolve,reject){if (is_promise){resolve(['a','b','c',1,2,3])} else {reject('客户没有来')}  
})
==========  第二个函数是reject  ============
zhtuser.then(
function(comment){alert(comment)
},function(comment){alert(comment)
})

Promises 函数最常见的应用是通过axios获得外部资源的数据。我们在开发中常常会看到axios操作中会使用到then与catch方法,这就最典型的Promises 函数操作。

axios.get('/api').then(function(response){//访问成功后进入
}).catch(function(error){//访问失败后进入
});

通过上面的学习,我们能够理解了Promises 功能中这些 resolve、reject、then、catch 方法。

3 Promises的状态

  Promises中有三种状态它们分别是pending(待定), fulfilled(完成), rejected(拒绝)。使用 Chrome 的开发者工具可以直观地看到Promises中的所属状态。

const is_promise = false
const zhtuser = new Promise(function(resolve,reject){if(is_promise){resolve(['a','b','c',1,2,3])} else {reject('客户没有来')}  
})
console.log(zhtuser);

1 拒绝状态

从目前提到的resolve和reject来看,fulfill状态是指遵守promise时的状态,返回reslove的值,rejected状态是指不遵守promise时的状态,返回reject的值。去做。

Promise[[Prototype]]: 
Promise[[PromiseState]]:"rejected"
[[PromiseResult]]: "客户没有来"

2 完成状态

将is_promise值设置成true ,在开发者工具中可以看到完成状态。

const is_promise = true
const zhtuser = new Promise(function(resolve,reject){if(is_promise){resolve(['a','b','c',1,2,3])} else {reject('客户没有来')}  
})
console.log(zhtuser);
=================  后台打印   =================
Promise {<fulfilled>: Array(6)}
[[Prototype]]:
Promise[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Array(6)

3 待定状态

​ 让我们来看一下 pending 等待状态是什么意思,它标识在promise代码中还没执行完成,程序还无法判断promise返回resolve和reject时候的状态。就是程序还没有决定返回resolve或者reject时候的状态。让我们使用setTimeout函数制作出一个pendig状态,并在5秒后返回一个resolve或者reject的结果。

const is_promise = true
const zhtuser = new Promise(function(resolve,reject){setTimeout(function(){if (is_promise){resolve('返回成功resolve')} else {reject('返回拒接reject')}},1000*5)})
console.log(zhtuser);

查看开发者工具,在 5 秒等待时间中状态会是 pending。 5 秒过后开发者工具中将显示状态resolve 或 reject。

Promise {}
[[Prototype]]:
Promise[[PromiseState]]: "pending"
[[PromiseResult]]: 

4 Promise的使用

  现在大家应该能够理解 promise中的 resolve、reject、then、catch、fulfilled、rejected、pending 这些关键字的含义了。那么Promise函数一般会在什么情况下来使用?

创建一个从上到下依次进行的过程,console中的内容的也会按顺序打印在控制台,这称为同步处理。

 console.log('流程1')console.log('流程2')console.log('流程3')console.log('流程4')

我们将其中的一些console打印时间停顿二秒钟在打印出来。使用 setTimeout 函数停顿2秒后打印在控制台,这称为异步处理。

console.log('流程1')
setTimeout(() => {console.log('流程2')
},2000)
setTimeout(() => {onsole.log('流程3')
},2000)
console.log('流程4')

由于这里指定了setTimeout函数设置了停顿的时间,但是在很多场景中我们是不知道停顿时间的,在不知道停顿时间情况下就不能使用此方法。这个时候就可以使用Promise来处理这种情况,then 方法会在 resolve 执行后运行,我们会使用到这个特性。

console.log('流程1')
new Promise((resolve) => {setTimeout(() => {console.log('流程3')resolve()},2000)
}).then(() => {console.log('流程2')
})console.log('流程4')后台打印结果
流程1
流程4
流程3
流程2

在 Promise 内部处理 setTimeout 时候 Promise 状态为 Pending。当 Promise 进入(fulfilled)状态时,then方法会被resolve执行,执行顺序是流程3在流程2。这样异步处理过程也可以像同步一样来完成了。

如果执行完流程3出现问题,流程终止不在执行流程2。这个功能可以使用 reject 和 catch来完成。

console.log('流程1')
new Promise((resolve,reject) => {setTimeout(() => {console.log('流程3')reject('流程结束')},2000)
}).then(() => {console.log('流程2')
}).catch((error) => {console.log(error)
})
console.log('流程4')
后台打印结果
流程1
流程4
流程3
流程结束

5 返回 Promise 类型

  很多开发者在使用 fetch 函数和 axios 库或者其他异步处理的函数时,都会遇到“返回Promise函数”这提示词。因为这些异步函数中很多都使用了Promise 作为它们的返回值类型。

我们来写一段fetch函数访问URL的代码,在浏览器的控制台中会如何执行的。

fetch('https://jsonplaceholder.typicode.com/todos/1').then(response => {console.log(response)
})

控制台在等待一段时间后执行了 console.log(response)。由于 fetch 函数是通过网络从 JSONPlaceHolder 中获取数据,因此无法立即获取到数据。在控制台中可以看到响应值是一个 Promise。因为fetch 函数帮我们处理了 resolve 和 reject封装过程,我们就不需要在编写 resolve 和 reject 的相关逻辑代码了。

Response {type: 'cors', url: 'https://jsonplaceholder.typicode.com/todos/1', redirected: false, status: 200, ok: true, …}
"https://jsonplaceholder.typicode.com/todos/1"
[[Prototype]]
Response

我们在使用有“返回Promise”的函数或者方法的时候,只需要使用thencatch 来做进一步的逻辑处理就可以了。不在需要关心它们内部的resolve 和 reject 代码如何编写的,直接拿来使用就可以了。

6 Promise级联使用

  Promise 可以可以相互链接在一起进行使用。我们可以将它们级联在一起,在执行一个Promise 过程之后,可以将该过程的结果传递给下一个Promise 继续执行。通过下面的例子大家能更好的体会Promise 级联执行的过程。

const is_flag1 = true
const is_flag2 = true
const z1 = new Promise(function(resolve,reject){if (is_flag1){resolve('流程执行')} else {reject('流程结束')}
})
const z2 = function(comment){return new Promise(function(resolve,reject){if (is_flag2){resolve(comment + ' 流程1')} else {reject(comment + ' 流程2')}})
}
z1.then(z2).then(function(z2){console.log(z2)
})
.catch(function(z2){console.log(z2)
})
后台打印结果
流程执行  流程1

让我们根据is_flag1和is_flag2的状态值来控制Promise 流程走向。

const is_flag1 = true
const is_flag2 = true
流程执行  流程1
==========================
const is_flag1 = true
const is_flag2 = false
流程执行  流程2
==========================
const is_flag1 = false
const is_flag2 = true
流程结束
==========================
const is_flag1 = false
const is_flag2 = false
流程结束

2 Promise多个then使用

我们可以在 Promise 函数中连接多次使用它的then函数。下面的代码中我连接了三个then方法, 3 秒后将显示6这个数字。从下面的代码中可以看出的前面的then方法结果会传递给了后面的then。

const addNumber = function(number) {return new Promise(function(resolve){setTimeout(() => {resolve(number + 1);}, 1000);});
};
addNumber(3).then(addNumber).then(addNumber).then(function(number){console.log(number)
})
后台打印结果
6  

当 Promise 被级联时候,Promise 的引用可以被当成参数传递到一下个 then方法中,then方法中的返回值就是下一个then的参数。

在下面的示例中,addNumber(1) 被执行并且 resolve 返回 2。将 2 传递给下一个 then,下一个 then 返回 4。返回值传递给下一个then,执行4*3。在将值传递给一下个then,执行12 乘4。

const addNumber = function(number) {return new Promise(function(resolve){setTimeout(() => {//number  2resolve(number + 1);}, 1000);});
};
addNumber(1).then(function(number){//number=2  2*2=4return number*2
}).then(function(number){//number=4  4*3=12return number*3
}).then(function(number){//number=12  4*12=48return number*4
}).then(function(number){console.log(number)
})
后台打印结果
48 

大家需要明白的是我们不仅使用Promise的resolve来传值给then,还还可以通过return把值传给下一个then。

Promise.all函数

使用Promise.all函数可以一次接收处理多个 Promise 的结果。

const addNumber = function(number) {return new Promise(function(resolve){setTimeout(() => {resolve(number + 1);}, 1000);});
};
Promise.all([addNumber(1),addNumber(2),addNumber(3)]).then(function(result){console.log(result)
})

相关文章:

JavaScript 中的Promise 函数

JavaScript 中的Promise 函数 目录JavaScript 中的Promise 函数1 创建Promise2 Promise的方法3 Promises的状态4 Promise的使用5 返回 Promise 类型6 Promise级联使用在现在的前端开发中我们常常会使用到 JavaScript Promise 函数&#xff0c;但是很多人都不能正确理解Promise …...

学校教的Python,找工作没企业要,太崩溃了【大四真实求职经历】

如果只靠学校学的东西去找工作&#xff0c;能找到工作吗&#xff1f; 今天给大家看一个粉丝的真实求职案例&#xff0c;想做Python方面的工作&#xff0c;投了二十几个简历却没人要&#xff0c;心态崩了。为什么没人要&#xff1f;我来告诉你答案。 然后我还会结合我的这些年的…...

快看!这只猫两次登上 Github Trending !!!

前几天我在逛 Github Trending&#xff0c;无意间发现这个Postcat 登上榜单 !好奇心驱使我去了解这个 Postcat。近期它上新了几个有意思的插件&#xff0c;其中 ChatGPT 插件&#xff0c;用户可以直接省去复杂的流程&#xff0c;直接体验 ChatGPT&#xff0c;懂的都懂&#xff…...

Linux->文件系统初识

目录 前言&#xff1a; 1 认识文件 2 文件使用 2.1 文件加载 2.2 外设文件使用 3 文件接口和文件描述符 3.1 文件系统调用接口 open&#xff1a; 3.2 文件描述符 4 缓冲区 前言&#xff1a; 在大家看这篇文章之前&#xff0c;我得提出几个问题&#xff1a; 1. 我们有多…...

InfluxDB和IotDB介绍与性能对比

InfluxDB简介 InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库&#xff0c;无需外部依赖。用于存储和分析时间序列数据的开源数据库。 适合存储设备性能、日志、物联网传感器等带时间戳的数据,其设计目标是实现分布式和水平伸缩扩展。 InfluxDB 包括用于存储和…...

计算机体系结构(校验码+总线)

校验码计算机系统运行时&#xff0c;为了确保数据在传送过程中正确无误&#xff0c;一是提高硬件电路的可靠性&#xff1b;二就是是提高代码的校验能力&#xff0c;包括查错和纠错。通常使用校验码的方法检测传送的数据是否出错。这里的校验码主要是指循环冗余校验码&#xff0…...

JavaWeb《三》Request请求转发与Response响应

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 本文是javaweb的第三篇&#xff0c;介绍了Request请求转发与Response响应。 上一篇&#xff1a;JavaWeb《二》Servlet、Request请求 下一篇&#xff1a;敬请期待 目录一、Request请求转发&#x1f34f;二、Response对…...

断言assert

assert作用&#xff1a;我们使用assert这个宏来调试代码语法&#xff1a;assert&#xff08;bool表达式&#xff09;如果表达式为false&#xff0c;会调用std::cout<<abort函数&#xff0c;弹出对话框&#xff0c;#include<iostream> #include<cassert> void…...

【Java项目】完善基于Java+MySQL+Tomcat+maven+Servlet的博客系统

目录一、准备工作二、引入依赖三、创建必要的目录四、编写代码五/六、打包部署(直接基于 smart tomcat)七、验证代码正式编写服务器代码编写数据库相关的操作代码创建数据库/表结构(数据库设计)数据库代码封装数据库操作封装针对数据的增删改查&#xff01;博客列表页约定前后端…...

详解结构体内存对齐

目录 前言 一、内存大小的计算 1.规则 2.练习 二、为什么要有内存对齐 1.移植原因 2.性能原因 三、修改默认对齐数 总结 前言 本文针对结构体大小的计算进行深度剖析。结构体的大小要遵守内存对齐&#xff0c;在绝大数情况下&#xff0c;会浪费空间。但是有其的价值&…...

指针:程序员的望远镜

指针&#xff1a;程序员的望远镜一、什么是指针1.1 指针的定义1.2 指针和普通变量的区别1.3 指针的作用1.4 指针的优点和缺点二、指针的基本操作2.1 取地址运算符"&"2.2 指针的声明与定义2.3 指针的初始化2.4 指针的解引用2.5 指针的赋值2.6 指针的运算2.7 指针的…...

【python实现学生选课系统】

一、要求&#xff1a; 选课系统 管理员&#xff1a; 创建老师&#xff1a;姓名、性别、年龄、资产 创建课程&#xff1a;课程名称、上课时间、课时费、关联老师 使用pickle保存在文件 学生&#xff1a; 学生&#xff1a;用户名、密码、性别、年龄、选课列表[]、上课记录{课程…...

备受青睐的4D毫米波成像雷达,何以助力高阶自动驾驶落地?

近日&#xff0c;海外媒体曝出特斯拉已向欧洲监管机构提交车辆变更申请&#xff0c;并猜测特斯拉最新的自动驾驶硬件HW4.0或将很快量产上车。据爆料&#xff0c;HW4.0最大的变化是马斯克放弃的毫米波雷达又加了回来&#xff0c;根据国外知名博主Greentheonly的拆解分析&#xf…...

3.20算法题(一) LeetCode 合并两个有序数组

题目链接&#xff1a;算法面试题汇总 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目描述&#xff1a;给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元…...

QT | 编写一个简单的上位机

QT | 编写一个简单的上位机 时间&#xff1a;2023-03-19 参考&#xff1a; 1.易懂 | 手把手教你编写你的第一个上位机 2.QT中修改窗口的标题和图标 3.图标下载 1.打开QT Creator 2.新建工程 Qt Creator 可以创建多种项目&#xff0c;在最左侧的列表框中单击“Application”&am…...

DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理(2/5)

目录3、IBL 数学原理3.1、基于微平面理论的 “Cook-Torrance” 模型回顾3.2、 ksk_sks​ 项与菲涅尔项等价消除3.3、拆分“漫反射项”和“镜面反射项”3、IBL 数学原理 接下来&#xff0c;就让我们正式进入整个 IBL 的数学原理的旅程。请注意&#xff0c;前方高能&#xff01; …...

嵌入式学习笔记——SysTick(系统滴答)

系统滴答前言SysTick概述SysTick是个啥SysTick结构框图1. 时钟选择2.计数器部分3.中断部分工作一个计数周期&#xff08;从重装载值减到0&#xff09;的最大延时时间工作流程SysTick寄存器1.控制和状态寄存器SysTick->CTRL2.重装载值寄存器SysTick->LOAD3.当前值寄存器Sy…...

Linux实操之服务管理

文章目录一、服务(service)管理介绍:service管理指令查看服务名服务的运行级别(runlevel):CentOS7后运行级别说明chkconfig指令介绍一、服务(service)管理介绍: 服务(service)本质就是进程&#xff0c;但是是运行在后台的&#xff0c;通常都会监听某个端口&#xff0c;等待其它…...

基于Java+SpringBoot+vue的毕业生信息招聘平台设计和实现【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;200套&#xff09; 目录 一、效果演示 二、…...

智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)

摘要&#xff1a;智能生活垃圾检测与分类系统用于日常生活垃圾的智能监测与分类&#xff0c;通过图片、视频和摄像头识别生活垃圾&#xff0c;对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数&#xff0c;以协助垃圾环保分类处理。本文详细介绍基于YOLO…...

建立农村污水处理设施已经成为了当务之急!

在现代社会中&#xff0c;随着城市化进程的加速和人口的增长&#xff0c;选择农村污水处理设备进行污水处理已经成为了一个非常重要的问题。虽然城市中的污水处理设施得到了很好的发展&#xff0c;但是农村地区的污水处理还存在很多问题。 在农村地区&#xff0c;由于缺乏污水…...

【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)

MATLAB求解一维线性函数问题前言正文函数实现可视化处理可视化结果前言 一维线性函数&#xff0c;也称为一次函数&#xff0c;是指只有一个自变量xxx的函数&#xff0c;且函数表达式可以写成yaxbyaxbyaxb的形式&#xff0c;其中aaa和bbb是常数。具体来说&#xff0c;aaa称为斜…...

【JavaEE】Thread 类及常用方法

一、Thread 类Thread 类我们可以理解为是 java 用于管理线程的一个类&#xff0c;里面封装了操作系统提供的线程管理这一方面的 API &#xff08;Thread 是优化后的结果&#xff09;, Java 代码创建的每一个线程&#xff0c;可以理解为为 Thread 实例化的对象&#xff0c;Threa…...

C语言数据结构初阶(7)----队列

CSDN的uu们&#xff0c;大家好。这里是C语言数据结构的第七讲。 目标&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a;姬如祎队列的基础知识队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除…...

代码随想录二刷 day01 | 704. 二分查找 27. 移除元素 977. 有序数组的平方

代码随想录二刷day01704. 二分查找27. 移除元素977. 有序数组的平方704. 二分查找 题目链接 做这种题最好现在纸上写一写&#xff0c;如果在大脑中想&#xff0c;可能一会就晕了。 二刷的时候发现了一个新的知识点 即&#xff1a; >>的作用 二分法第二种写法&#xff1a…...

Linux 终端、进程组、会话、守护进程

文章目录一、终端概念终端概念控制终端二、进程组概念进程组概述进程组相关 API会话会话概念会话相关 API创建会话注意事项守护进程守护进程介绍守护进程模型守护进程参考代码守护进程相关 API参考文章一、终端概念 终端概念 1、终端&#xff08;Terminal&#xff09; 终端是…...

你是否有潜质成为谷歌开发者专家?加入 GDE 成长计划,释放潜力!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...

安全防御之防火墙篇(二)

目录 1.防火墙如何处理双通道协议&#xff1f; 2.防火墙如何处理NAT&#xff1f; 3.防火墙支持哪些NAT技术&#xff0c;主要应用的场景是什么&#xff1f; 4.当内网PC通过公网域名解析访问内网服务器的时候&#xff0c;会存在什么问题&#xff0c;如何解决&#xff1f;请详细…...

设计必备,5个png免抠素材网站,建议收藏

做设计、PPT都需要用到大量的免抠素材&#xff0c;职场中熟练使用Photoshop的人毕竟是少数&#xff0c;也很少有人愿意花费时间去精细抠图。那这5个免抠素材网站一定要收藏好&#xff0c;可以有效帮你节省时间&#xff0c;提高工作效率。 1、菜鸟图库 https://www.sucai999.co…...

shell 脚本expect

expect 是什么 expect - programmed dialogue with interactive programs&#xff08;与互动程序进行程序对话&#xff09; 定义脚本执行的 shell #!/usr/bin/expect -f 定义的是执行 expect 可执行文件的链接路径&#xff08;或真实路径&#xff09;&#xff0c;功能类似于bas…...