返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js中异步函数asyncfunction变同步函数的简单入门
  • 843
分享到

js中异步函数asyncfunction变同步函数的简单入门

js异步函数jsasyncfunctionjs同步函数 2023-05-17 11:05:10 843人浏览 安东尼
摘要

目录js异步函数async function变同步函数入门异步函数(async/await)异步函数异步函数策略总结js异步函数async function变同步函数入门 js 中异

js异步函数async function变同步函数入门

js 中异步函数之所以特别,一个重要的原因就是它执行完成的时间、耗费的时间靠人的主观是不得而知的。

所以不能靠设置定时函数来让上一个程式完成之后来进行下一个函数。

接上次的文章:js 异步获取到的数据 到底能不能 赋值给一个全局变量

所以 promise 就突出了它的作用,目前程式执行在那个阶段 结果是什么 promise 知道。新建一个 promise 对象。

new Promise(function (resolve, reject) {
    // 要做的事情...
});

尝试一个 ajix 请求

<script>
    var GoodsInfo = {};
    $(document).ready(function(){
    //    使用Promise
    new Promise(function (resolve,reject) {
            $.ajax({url:"https://api-hmugo- WEB.itheima.net/api/public/v1/home/catitems",success:function(result){
                    goodsInfo = result;
                    resolve(goodsInfo);
                    console.log(goodsInfo);
                }});
        }).then(function () {
            console.log(goodsInfo);
        })
        console.log(1);
        console.log(goodsInfo);
    });
</script>

看是不是在 .then() 中得到了经过ajax请赋值后的全局变量 goodsInfo 的值,如果再有什么对 goodsInfo 的操作,在 .then 中进行即可。

ajax在项目会频繁使用,将其封装成一个函数会更方便

<script>
 
    var goodsInfo = {};
    $(document).ready(function(){
 
// 封装一个 promise 函数,在promiise对象前面多加了一个return
        function promiseFun (url){
            return new Promise(function (resolve,reject) {
                $.ajax({url:url,success:function(result){
                        goodsInfo = result;
                        resolve(goodsInfo);
                        console.log(goodsInfo);
                    }});
            })
        }
// 调用函数
        promiseFun("Https://api-hmugo-web.itheima.net/api/public/v1/home/catitems").then(function () {
            console.log(goodsInfo);
        })
        console.log(1);
        console.log(goodsInfo);
    });
</script>

结果依然一样。调用的时候是不是又简约一点。 async function 感觉是又进了异步

// 定义规则
async function asyncFunc() {
    // await 后面必须是定义过的 promise function 
    await myfunction();
    await youfunction();
    await shefunction();
    somefunction();
    xxxxxx;
    
}
asyncFunc();
<script>
    var goodsInfo = {};
    var data ={};
    $(document).ready(function(){
// 先定义一个 promise function
        function promiseFun (url){
            return new Promise(function (resolve,reject) {
                $.ajax({url:url,success:function(result){
                        goodsInfo = result;
                        resolve(goodsInfo);
                        console.log(goodsInfo);
                    }});
            })
        }
// 在定义一个 asyns function 
     async function asyncFuunc(){
// 看这里面的代码执行顺序是不是跟同步函数简直一模一样
            await promiseFun("https://api-hmugo-web.itheima.net/api/public/v1/home/catitems");
            console.log(goodsInfo);
            data=goodsInfo;
            console.log(data)
            console.log(2);
     }
// 调用 asyns 函数
        asyncFuunc();
        console.log(1);
        console.log(goodsInfo);
    });
</script>

异步函数(async/await)

异步函数

异步函数,也称为"async/await" (语法关键字),是es6 期约模式在ECMAScript 函数中的应用。async/await 是ES8 规范新增的。为了解决利用异步结构组织代码的问题。

  • async

async 关键字用于声明异步函数。这个关键字可以用在函数声明、函数表达式、箭头函数和方法上:

    async function foo() {}   
    let bar = async function() {};  
    let baz = async() => {};   
    class Qux {   
        async qux() {}   
    }

异步函数如果使用return 返回了值(没有return 则会返回undefined),这个值会被Promise.resolve() 包装成一个期约对象。

    async function foo(){
        console.log(1)
    }

    console.log(foo()); //promise {<fulfilled>:undefined}
    foo().then(console.log) //undefined
    console.log(2)
    //1
    //2
    //undefined
  • await

await 关键字可以暂停异步函数代码的执行,等待期约解决。await 会暂停执行异步函数后面的代码,让出JS 运行时的执行线程。这个行为与生成器函数中的yield 关键字是一样的。await 关键字同样是尝试 “解包” 对象的值,然后将这个值传给表达式,再异步恢复异步函数的执行。

await 关键字必须在异步函数中使用;异步函数的特质不会扩展到嵌套函数。否则会抛出SyntaxError;

async function foo(){
    await Promise.resolve(3);
}
foo();

async/await 中真正起作用的是await。异步函数如果不包含await 关键字,其执行基本上跟普通函数没什么区别。

javascript 运行时在碰到await 关键字时,会记录在哪里暂停执行。等到await 右边的值可用了,js运行时会向消息队列中推送一个任务,这个任务会恢复异步函数的执行。

因此,即使await 后面跟着一个立即可用的值,函数的其他部分也会被异步求值。

    async function foo() { 
        console.log(2);   
        await null;
        console.log(4);  
    }   
    console.log(1);
    foo();
    console.log(3);
    // 1
    // 2
    // 3
    // 4
    
    控制台中输出结果的顺序很好地解释了运行时的工作过程:
    (1)打印1;
    (2)调用异步函数foo();
    (3)(在foo()中)打印2;
    (4)(在foo()中)await关键字暂停执行,为立即可用的值null向消息队列中添加一个任务;
    (5)foo()退出;
    (6)打印3;
    (7)同步线程的代码执行完毕;
    (8)JavaScript运行时从消息队列中取出任务,恢复异步函数执行;
    (9)(在foo()中)恢复执行,await取得null值(这里并没有使用);
    (10)(在foo()中)打印4;
    (11)foo()返回。

异步函数策略

  • 实现sleep()

很多人在刚开始学习JavaScript时,想找到一个类似Java中Thread.sleep()之类的函数,好在程序中加入非阻塞的暂停。以前,这个需求基本上都通过setTimeout()利用JavaScript运行时的行为来实现的。

有了异步函数之后,就不一样了。一个简单的箭头函数就可以实现sleep():

 async function sleep(delay) {
        return new Promise((resolve) => setTimeout(resolve, delay));
    }

    async function sleepfoo(){
        const t0 = Date.now();
        await sleep(2000);
        const t1 = Date.now();
        console.log(t1 - t0);
    }
    sleepfoo()
    //2002  任务队列执行,时间不一定
  • 利用平行执行
  • 串行执行期约
  • 栈追踪与内存管理

注意:

异步函数是将期约应用于JavaScript函数的结果。异步函数可以暂停执行,而不阻塞主线程。无论是编写基于期约的代码,还是组织串行或平行执行的异步代码,使用异步函数都非常得心应手。异步函数可以说是现代JavaScript工具箱中最重要的工具之一。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: js中异步函数asyncfunction变同步函数的简单入门

本文链接: https://lsjlt.com/news/211116.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • js中异步函数asyncfunction变同步函数的简单入门
    目录js异步函数async function变同步函数入门异步函数(async/await)异步函数异步函数策略总结js异步函数async function变同步函数入门 js 中异...
    99+
    2023-05-17
    js异步函数 js async function js同步函数
  • Node.js基础入门之回调函数及异步与同步详解
    目录回调函数1. 什么是回调函数?2. 回调函数实现机制3. 回调函数用途4. 回调函数示例异步与同步1. 什么是异步与同步?2. 同步示例3. 异步示例一4. 异步示例二异步的实现...
    99+
    2024-04-02
  • 浅析JS的异步函数async/await
    async/await 可能会产生误导有些文章将 async/await 与 Promise 进行比较,并声称它是 JavaScript 异步编程发展的下一代,这一点个人觉得有点误导,个人认为 async/await 是一种改进,一个语法糖...
    99+
    2023-05-14
    JavaScript ECMAScript 6 Node.js
  • PHP8.0中的异步函数
    PHP8.0是PHP语言的最新版本,在其中新增了一些非常重要的功能,其中最为突出的一项就是异步函数的支持。本文将着重介绍PHP8.0中的异步函数,包括异步编程的概念、优点以及在PHP8.0中的具体应用。异步编程概念在传统的编程方式中,程序是...
    99+
    2023-05-14
    编程 PHP 异步函数
  • js如何获取异步函数数据
    本篇内容介绍了“js如何获取异步函数数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!异步函数一般正常情况下,js中的函数是一个一个地按照顺...
    99+
    2023-07-05
  • Golang函数的同步和异步的实现方法
    Golang是一种支持并发编程的高级编程语言,它提供了丰富的并发编程机制和语法特性,方便开发者实现复杂的多线程或多协程程序。其中,同步和异步是并发编程中常用的两种方式,本文将介绍Golang函数的同步和异步的实现方法及其使用场景。一、同步函...
    99+
    2023-05-18
    异步 同步 Golang函数
  • JS的异步函数async/await怎么使用
    这篇“JS的异步函数async/await怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS的异步函数async/a...
    99+
    2023-07-05
  • js异步函数async/awit怎么使用
    异步函数(async/await) 是一种用于处理 JavaScript 异步操作的语法糖,它建立在 Promise 基础之上,使得...
    99+
    2023-09-29
    js
  • Go 中异步函数的单元测试方法
    在 go 中,异步函数可以通过并发测试进行单元测试,以模拟并发执行并测试异步函数的行为。步骤如下:创建一个超时上下文。创建一个通道来接收结果。调用异步函数并将结果写入通道。从通道中读取结...
    99+
    2024-05-01
    go 单元测试 异步函数
  • 同步还是异步?Python Spring 函数如何选择?
    在开发过程中,我们常常需要处理大量的数据,而这些数据处理需要消耗大量的时间。为了提高程序的效率,我们可以使用异步和同步两种处理方式来实现数据处理。 Python和Spring框架都提供了异步和同步的函数处理方式。在选择使用哪种方式时,我们...
    99+
    2023-06-22
    spring 函数 同步
  • Python混合怎么使用同步和异步函数
    在协程函数中调用同步函数在协程函数中直接调用同步函数会阻塞事件循环,从而影响整个程序的性能。我们先来看一个例子:以下是使用异步 Web 框架 FastAPI 写的一个例子,FastAPI 是比较快,但不正确的操作将会变得很慢。import ...
    99+
    2023-05-14
    Python
  • Python混合如何使用同步和异步函数
    这篇文章主要介绍“Python混合如何使用同步和异步函数”,在日常操作中,相信很多人在Python混合如何使用同步和异步函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python混合如何使用同步和异步函数...
    99+
    2023-07-06
  • JS中实现一个串型异步函数队列
    目录背景通常解法async/await 串型请求for...of 解法需求一reduce 实现需求二递归实现背景 在日常业务开发中,总会遇到这种场景,有一串请求,下一个请求依赖上一个...
    99+
    2024-04-02
  • 怎么用Async函数简化异步代码
    今天就跟大家聊聊有关怎么用Async函数简化异步代码,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Promise 在 JavaScript 上发布之...
    99+
    2024-04-02
  • JS如何实现异步函数队列功能
    小编给大家分享一下JS如何实现异步函数队列功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:场景:做直播,会有入场消息...
    99+
    2024-04-02
  • 简单谈谈Python中函数的可变参数
    前言 在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。 可...
    99+
    2022-06-04
    函数 参数 简单
  • Python Spring 函数同步与异步:哪个更适合你的项目?
    在 Python 开发中,函数同步和异步是两个非常常见的概念。对于一些需要处理大量数据或者需要处理一些时间敏感任务的项目,我们需要使用异步函数来提高程序的性能和响应速度。但是对于一些简单的项目,使用同步函数更加方便和易于维护。那么,对于你...
    99+
    2023-06-22
    spring 函数 同步
  • nodejs中有哪些async异步函数
    本篇文章给大家分享的是有关nodejs中有哪些async异步函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。async的集合控制:async...
    99+
    2024-04-02
  • 从入门到精通:ASP 函数在 Linux 异步编程中的应用指南
    ASP 函数是一种常用的编程语言,它在 Linux 异步编程中也有着广泛的应用。本文将从入门到精通,为大家介绍ASP 函数在 Linux 异步编程中的应用指南。 一、什么是 ASP 函数? ASP 函数是一种常用的编程语言,它可以在 ASP...
    99+
    2023-11-01
    函数 linux 异步编程
  • Python 异步编程入门指南:掌握 load 函数的使用方法
    随着互联网的发展,越来越多的人开始关注异步编程。Python 作为一门流行的编程语言,也提供了一些强大的异步编程工具,例如 asyncio 库。在异步编程中,load 函数是一个非常重要的函数,它可以帮助我们实现高效的异步操作。本文将介绍...
    99+
    2023-10-17
    异步编程 编程算法 load
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作