千家信息网

js中怎么用async和await实现同步

发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,这篇"js中怎么用async和await实现同步"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来
千家信息网最后更新 2025年02月22日js中怎么用async和await实现同步

这篇"js中怎么用async和await实现同步"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"js中怎么用async和await实现同步"文章吧。

首先我们假设有一方法 readFile 可以读取文件内容, 但是它是异步的。

var gen = function* (){    var a = yield readFile('./a.txt');    console.log(a.toString());    var b = yield readFile('./b.txt');    console.log(b.toString());};

首先我们看下上面的代码,如果我们将function 后面的 * 改成 async,将yield 改成 await,也就是下面的代码

var gen = function async (){    var a = await readFile('./a.txt');    console.log(a.toString());    var b = await readFile('./b.txt');    console.log(b.toString());};

是不是就是我们想要的同步写异步操作了,第一种写法就是 es6 中新支持的特性,Generator 函数,那什么是 Generator 函数呢,简单来说Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。上面的官方解释看不懂没关系。我们下面用例子演示下。

function* func(){     console.log("one");     yield '1';     console.log("two");     yield '2';     console.log("three");     return '3'; }var f = func();f.next(); // one // {value: "1", done: false} f.next(); // two // {value: "2", done: false} f.next(); // three // {value: "3", done: true} f.next(); // {value: undefined, done: true}

上面的代码我们第一次调用 f.next() 时,函数 func 开始执行,并在执行到第一个 yield 时停住,并返回 yield 后面表达式的值,格式就是 {value: "1", done: false} 这种格式,value就是 yield 表达式的值
done 表示func函数是否执行完毕,此时如果我们如果接着调用 f.next(),类推将返回第二 yield 后面表达式的值,也就是 {value: "2", done: false}。我们可以继续调用 f.next() 直至 done 变成 true, 它表示func函数执行完了。

function* func(){    var a = yield '1';    console.log(a);    var b = yield '2';    console.log(b);}var f = func();f.next(); f.next('1');

f.next('2');我们继续改造 func 函数为上面这种,在 next 分别传入 1 和 2,我们会发现 console.log(a) 打印 1 ,console.log(b) 打印 2,也就是我们可以传值到 Generator 函数中。
现在我们回到下面这段代码上面来,然后重新设计下,并实现 readFile 函数。

var gen = function* (){    var a = yield readFile('./a.txt');    console.log(a.toString());    var b = yield readFile('./b.txt');    console.log(b.toString());};var readFile = function (fileName){    return new Promise((resolve)=>{        fs.readFile(fileName, (err, data)=>{            resolve(data);        })    });};function run(fn) {    var gen = fn();    function next(data) {        var result = gen.next(data);        if (result.done) return;        result.value.then((data)=>{            next(data);        })    }    next();}run(gen);

看上面的代码我们用 promise 实现 readFile 函数,此时我们 yield 的返回值就是一个 promise 对象了,我们就可以使用, result.value.then((data)=>{next(data);})将 yield 返回的 value 值重新传回 Generator 函数,这样我们的 console.log(a.toString()); 就可以获取到 a.txt 文件中的内容了, if (result.done) return; 可以用了判断 Generator 函数 是否已执行完毕,用来结束循环调用。所以如果我们单独去看 gen 函数,是不是就是将异步操作写成同步语法了,如果我们将function 后面的 * 改成 async,将yield 改成 await也就是我们常用语法了。

以上就是关于"js中怎么用async和await实现同步"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

函数 内容 就是 同步 也就是 代码 面的 对象 状态 表达式 语法 文件 文章 格式 知识 篇文章 没关系 也就是说 价值 例子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库百货商店关系模型图 公司服务器连接不了电脑 方舟服务器怎么开启管理员 天谕手游服务器等级开放时间 浙江正规网络技术服务推广 传奇世界如何开服务器 分布式数据库在线ddl 网络安全山东张敬 rest多维数据库 搜索六年级网络安全绘画照片 电脑网络安全模式下能使用吗 风电设计软件开发上市公司 网络技术与幼教 数据库删除的记录能恢复吗 是网络安全生态的核心竞争 陈俊川技术专家数据库 脚本软件开发郑州 软件开发企业应交增值税率 学网络安全应该报什么专业 平安科技算是互联网公司吗 景德镇安卓软件开发 如何恢复删掉的数据库用户 河南pdu服务器电源哪个牌子好 广东软件开发专业有哪些 吐鲁番软件开发均价 水文数据库表zz zq 大学数据库安全策略 网络安全手抄报100图简单 国家安全网络技术员 苹果王者哪个服务器比较好
0