首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尽管我指定了async / await,但该函数并不同步工作

基础概念

async/await 是 JavaScript 中用于处理异步操作的一种语法糖。通过使用 asyncawait,你可以以同步的方式编写异步代码,从而避免回调地狱(Callback Hell)和提高代码的可读性。

相关优势

  1. 可读性:使用 async/await 可以使异步代码看起来更像同步代码,从而提高代码的可读性和维护性。
  2. 错误处理:可以使用传统的 try/catch 语句来捕获异步操作中的错误,这比传统的 Promise 链式调用中的错误处理要简单直观得多。

类型

  • async 函数:使用 async 关键字声明的函数,返回一个 Promise 对象。
  • await 表达式:只能在 async 函数内部使用,用于等待一个 Promise 对象的解析结果。

应用场景

任何需要处理异步操作的场景都可以使用 async/await,例如网络请求、文件读写、定时器等。

问题原因及解决方法

尽管你指定了 async/await,但函数并不同步工作,可能有以下几个原因:

  1. 函数未被正确声明为 async
  2. 函数未被正确声明为 async
  3. 解决方法是将函数声明为 async
  4. 解决方法是将函数声明为 async
  5. 在非 async 函数中使用 await
  6. 在非 async 函数中使用 await
  7. 解决方法是将调用该函数的代码放在一个 async 函数中:
  8. 解决方法是将调用该函数的代码放在一个 async 函数中:
  9. Promise 被拒绝但未被捕获
  10. Promise 被拒绝但未被捕获
  11. 解决方法是使用 try/catch 捕获错误:
  12. 解决方法是使用 try/catch 捕获错误:

示例代码

以下是一个完整的示例,展示了如何正确使用 async/await

代码语言:txt
复制
async function fetchData() {
    try {
        let response = await fetch('https://api.example.com/data');
        if (!response.ok) {
            throw new Error('Network response was not ok ' + response.statusText);
        }
        let data = await response.json();
        return data;
    } catch (error) {
        console.error('Error fetching data:', error);
        throw error;
    }
}

async function main() {
    try {
        let data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error('Error:', error);
    }
}

main();

参考链接

希望这些信息能帮助你解决 async/await 不同步工作的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 asyncawait 不仅仅是句法糖

async/await 让异步代码变成同步的方式,从而使代码更具表现力和可读性。 async/await 统一异步编程的经验;以及提供更好的错误堆栈跟踪。...async/await同步和异步代码中提供统一的体验 async/await的另一个好处是,await自动将任何非Promise(non-thenables)包装成 Promises 。...从匿名的箭头函数切换到命名的函数声明有一点帮助,帮助不大: function foo() { return bar().then(() => 'value'); } function bar()...首先,当独立的异步函数调用可以用Promise.all并发处理时,如果我们还大量使用async/await 可能会导致滥用,这样会造成开发者不去试图了解 Promise 的幕后是如何工作,而只是一味的使用...但我不认为async/await本身与FP不相容。 无论如何,对于大多数人来说,包括我在内,FP仍然是一种后天的味道(尽管我确实认为FP超级酷,而且我正在慢慢学习它)。

84820

asyncawait 的基本实现和 .NET Core 2.1 中相关性能提升

标记的异步操作都会产生一个骨架方法和状态机对象 arg - 显然原始代码上有多少个参数,生成的代码中就会有多少个字段 __moveNext - 恢复委托函数,对应状态机中的 MoveNext 方法,委托函数会在执行过程中作为回调函数返回给对应...,当前执行的方法都会将方法的剩余部分注册为回调函数(当前 await 任务完成后接下来要进行的工作,也可能包含 await 任务,仍然可以顺序嵌套),然后立即返回(return builder.Task...有关这方面的奇思妙想,请参阅《通过 Await 暂停和播放》 .NET Core 2.1 性能提升 上节关于编译器生成的内容并不能完全涵盖 async/await 的所有实现概念,甚至只是其中的一小部分...,比如笔者并没有提到可等待模式(IAwaitable)和执行上下文(ExecutionContext)的内容,前者是 async/await 实现的指导原则,后者则是实际执行异步代码,返回给调用者结果和线程同步的操控者...结语 本文主要介绍 async/await 的实现和 .NET Core 2.1 中关于异步操作性能优化的相关内容。因为笔者水平一般,文章篇幅有限,不能尽善美地解释完整,还希望大家见谅。

42420
  • asyncawait 的基本实现和 .NET Core 2.1 中相关性能提升

    标记的异步操作都会产生一个骨架方法和状态机对象 arg - 显然原始代码上有多少个参数,生成的代码中就会有多少个字段 __moveNext - 恢复委托函数,对应状态机中的 MoveNext 方法,委托函数会在执行过程中作为回调函数返回给对应...,当前执行的方法都会将方法的剩余部分注册为回调函数(当前 await 任务完成后接下来要进行的工作,也可能包含 await 任务,仍然可以顺序嵌套),然后立即返回(return builder.Task...有关这方面的奇思妙想,请参阅《通过 Await 暂停和播放》 .NET Core 2.1 性能提升 上节关于编译器生成的内容并不能完全涵盖 async/await 的所有实现概念,甚至只是其中的一小部分...,比如笔者并没有提到可等待模式(IAwaitable)和执行上下文(ExecutionContext)的内容,前者是 async/await 实现的指导原则,后者则是实际执行异步代码,返回给调用者结果和线程同步的操控者...结语 本文主要介绍 async/await 的实现和 .NET Core 2.1 中关于异步操作性能优化的相关内容。因为笔者水平一般,文章篇幅有限,不能尽善美地解释完整,还希望大家见谅。

    56540

    浅谈.Net异步编程的前世今生----异步函数篇(完结)

    最后一个异步编程模型:异步函数 概述 由于异步函数为语言特性的实现,因此它的本质依然属于TPL模型,提供更高级别的抽象,真正简化了异步编程。...如图所示,我们依然定义TPL和Async函数进行对比: 我们在定义AsyncAwait方法时,依然使用同步代码的方式进行书写,唯一的不同之处是连续使用了两个await声明。...,代码会在计时器到了Task.Delay中指定的时间后进行调用,之后立即将工作线程返回线程池中; 3、当计时器事件运行时(类似于Timer类),我们会再次从线程池中获取一个可用的工作线程并运行计时器给它的代码...由于思想和语法相当简洁,在其他语言中也借鉴类似的语法,如JavaScript在ES6标准中也引入了async-await的写法来实现异步,避免了多个回调嵌套的尴尬方式。...关于async-await本身,C#编译器在背后通过及其复杂的原理为我们屏蔽底层的细节,包括为何不能使用async void等等,这些原理还是建议大家有时间的话进行一些挖掘和探究,学习背后的设计思想

    67720

    ES6 系列之我们来聊聊 Async

    async 与 Promise 严谨的说,async 是一种语法,Promise 是一个内置对象,两者并不具备可比性,更何况 async 函数也返回一个 Promise 对象…… 这里主要是展示一些场景...console.log(err) } }; async/await 的出现使得 try/catch 就可以捕获同步和异步的错误。...async 断点演示 而使用 async 的时候,则可以像调试同步代码一样调试。...async 地狱 async 地狱主要是指开发者贪图语法上的简洁而让原本可以并行执行的内容变成了顺序执行,从而影响了性能,用地狱形容有点夸张了点…… 例子一 举个例子: (async () => {...getAnotherList() 其实并没有依赖关系,但是现在的这种写法,虽然简洁,却导致 getAnotherList() 只能在 getList() 返回后才会执行,从而导致多一倍的请求时间。

    1K30

    Python|玩转 Asyncio 任务处理(1)

    协程 创建协程对象的方法非常简单,只需在函数或方法的定义前添加 async 关键字即可。这样的标识意味着该函数可以通过事件循环来暂停和恢复执行(如果协程中包含 await 关键字)。...调用协程函数时,并不会直接执行函数体,而是生成一个协程对象。之后,你需要使用 await 关键字来等待这个对象,从而触发协程内的代码执行。...下面是上述示例的变体,演示这些任务方法的应用: import asyncio async def my_function(): return ‘Hello World!...asyncio.run(main()) 尽管我们通常会创建任务,并通过某种方式等待它们完成,如果你希望创建一个任务后就不用再去关心它,你可以采用以下模式。...与直接使用 await 的不同之处在于,这个函数还提供设置超时的功能。

    9810

    Actors

    这跟串行 DispatchQueue 概念相似, actor 运行时中实际源码实现使用了更轻量级的实现,实现利用了 Swift 的async函数。...一般来说,避免破坏await间不变量的最简单方法是把状态更新封装到同步 actor 函数中。实际上,actor 中的同步代码提供一个关键部分,而await会中断关键部分。...引用和actor隔离 某个 actor-isolated async声明只能被另一个在相同actor的 actor-isolated 声明同步访问。...inout parameters 通过inout参数,可以把 actor-isolated 存储属性传给同步函数如果传给异步函数是不规范的。...从异步代码中可以安全引用Sendable的let类型,并且该类型可以在其他上下文中工作(比如本地变量)。让某些不可变状态在其他状态下实现并发安全,并不会让关于数据竞争安全的并发编程变得复杂。

    1.2K51

    使用异步操作时的注意要点(翻译)

    Task.FromResult在具有SynchronizationContext 程序中(例如WinForm)调用Result或wait()并不会死锁(虽然并不建议这么干) ❌对于预计算或普通计算的函数不应该这么写...,恢复等待操作的代码 虽然看起来并没有什么关系,但是其实这里却是使用了两个线程来完成同步操作,这样通常会导致线程饥饿和死锁 ?...来代替continueWith任务 在asyncawait,当时可以使用continueWith来延迟执行一些方法,但是continueWith并不会捕捉`SynchronizationContext...(); } } 11.建议使用 async/await而不是直接返回Task 使用async/await 代替直接返回Task具有以上好处 异步和同步的异常都被始终被规范为了异步 代码更容易修改...类中有一个接收回调函数的FireAndForget方法,方法在某个时候执行调用 ❌下面这个错误例子将强制调用者要么阻塞要么使用async void异步方法 public class BackgroundQueue

    4.6K20

    C#异步使用要点(翻译)

    Task.FromResult在具有SynchronizationContext 程序中(例如WinForm)调用Result或wait()并不会死锁(虽然并不建议这么干) 对于预计算或普通计算的函数不应该这么写...,恢复等待操作的代码 虽然看起来并没有什么关系,但是其实这里却是使用了两个线程来完成同步操作,这样通常会导致线程饥饿和死锁 线程饥饿(starvation):指等待时间已经影响到进程运行,如果等待时间过长...来代替continueWith任务 在asyncawait,当时可以使用continueWith来延迟执行一些方法,但是continueWith并不会捕捉SynchronizationContext,...); } 2.创建回调函数参数时注意避免 async void 假如有BackgroudQueue类中有一个接收回调函数的FireAndForget方法,方法在某个时候执行调用 下面这个错误例子将强制调用者要么阻塞要么使用...构造函数同步,下面看看在构造函数中处理异步情况 下面是使用客户端API的例子,当然,在使用API之前需要异步进行连接 public interface IRemoteConnectionFactory

    3.4K50

    C#并发编程之异步编程(二)

    写在前面 前面一篇文章介绍异步编程的基本内容,同时也简要说明了asyncawait的一些用法。...异步方法基础及其运行流程 AsyncAwait 异步方法使用async修饰,方法包含一个或多个await表达式或语句,方法同步运行,直至到达第一个 Await,此时暂停,直到等待的任务完成,在任务完成后...如果方法中并不包含await,则方法不会像同步方法一样被挂起。...异步方法使用await关键字来确定等待位置,await表达式并不阻止正在执行到此位置的线程,也就是说异步方法在await表达式执行时只是暂停,并不会导致方法退出,只会导致finally代码块不运行。...任务继续调用同步方法 DoIndependentWork。 DoIndependentWork 作为一个同步方法,在自身工作完成后返回到调用方。

    1.2K20

    结构化并发

    但是async/await本身并不引入并发:如果在异步函数内忽略挂起点,它基本与同步函数执行方式相同。...本篇提案并没有为所有这些问题提出解决方案,早期的调查显示还是可以解决。 任务 在系统中任务是并发的基本单元。每个异步函数都在异步中执行。换句话说,任务是异步函数,线程是同步函数。...一个已完成的任务没有其他工作要做,并且也从来不会进入其他状态。 代码可以用各种方法等待任务完成,最显著的是使用await来标记该段代码。 我们讨论的对任务和异步函数的执行相比同步函数更复杂。...异步函数作为任务的一部分运行,如果任务正在运行,任务和它当前的函数也都运行在一个线程中; 注意,当一个异步函数调用另一个异步函数时,我们任务正在调用的函数是挂起状态,并不意味整个任务是挂起状态。...并发有限制:创建子任务的函数必须等子任务结束才能返回。这种结构意味着函数可以对当前任务正在完成的所有工作进行局部推理,比如预测取消当前任务的影响等。它还使创建子任务的效率大大提高。

    3K40

    c#异步编程-Task(二)

    二、详细内容 1.同步异步 同步操作会在返回调用者之前完成它的工作 异步操作会在返回调用者之后去做它的工作 异步的方法更为少见,会启用并发,因为他的工作会与调用者并行执行 目前见到的大部分的异步方法都是通用目的的...,continuation将发送到同步上下文上,同步上下文通过消息循环执行,来保证整个Go方法伪并发在UI线程上执行。...示例代码: public async Task Go(){ //这里不要return,必须有await的方法在Go的函数体内 } 编译器会对返回Task的异步函数进行扩展,使其成为发送信号或发生故障时使用...方法被触发时下面声明的Exception则不会被发现。...5.优化同步完成 异步函数可以在await之前就返回。

    2.5K30

    使用 Swift 的并发系统并行运行多个任务

    因此,尽管我们的顶级loadRecommendations方法相对于我们应用程序的其他代码正在并发执行,实际上它还没有利用并发来执行其内部操作集。...相反,我们需要利用 Swift 的async let绑定来告诉并发系统并行执行我们的每个加载操作。使用语法使我们能够在后台启动异步操作,而无需我们立即等待它完成。...因此async let,当我们有一组已知的、有限的任务要执行时,它提供一种同时运行多个操作的内置方法。如果不是这样呢?...images } } 现在让我们说,就像我们ProductLoader之前的工作一样,我们想让上面的loadImages方法并发执行,而不是按顺序下载每个图像(目前是这种情况,因为我们await...结论 重要的是要记住,仅仅因为给定的函数被标记为async并不一定意味着它同时执行它的工作

    1.2K20

    asyncawait初学者指南

    并不是说我们应该对所有的事情都使用async/await语法确实有其缺点,我们将在讨论错误处理时看到),但我们应该意识到这是可能的。...并行运行异步命令 当我们使用await关键字来等待一个异步操作完成时,JavaScript解释器会相应地暂停执行。虽然这很方便,这可能并不总是我们想要的。...同步循环中的异步await 在某些时候,我们会尝试在一个同步循环中调用一个异步函数。...; console.log(msg); 顶层await解决这个问题,使上述代码有效,只在ES模块中奏效。...总结 在这篇文章中,我们研究了如何使用async/await来管理你的JavaScript程序的控制流。我们讨论语法、async/await如何工作、错误处理,以及一些问题。

    29620

    为什么我避免使用asyncawait?

    Async/await让你的异步代码看起来像同步的一样。这是它的卖点。但对我来说,这就是问题所在。它从一开始就为你的代码所发生的事情设定错误的心理模型。...同步代码可能比异步代码更容易处理,同步代码不是异步代码。它们有非常不同的属性。很多时候这不是问题,当它是问题时,就很难识别,因为async/await正好隐藏显示它的线索。以这段代码为例。...在async/await版本中并不是没有提示。关键字asyncawait应该给我们同样的直觉,就像第三个版本中的then一样。但我敢打赌,对许多工程师来说,它并没有。为什么没有呢?...promise在任何情况下都能完成工作,而且每次都和async/await一样好,甚至更好。错误处理处理错误对于异步代码来说是至关重要的。...为包括错误处理和并行化在内的更复杂的工作流提供一个更干净的选择。注:特别感谢技术指导dazhao(赵达)对本文的审阅指正。

    1.8K42

    Asyncawait

    这完全违背异步函数的目的,并产生恶劣的系统性影响。 相反,异步函数可以调用同步函数和异步函数。当异步函数调用同步函数时,首先异步函数不会放弃所在线程。...如果某个类的async初始化函数没有调用父类的初始化函数,当父类的初始化函数有参数,同步且是指定的初始化函数(designated initializer),那么该类的初始化函数会隐式地调用super.init...当重载解析选择async函数时,给定的调用依然受 “异步函数调用必须发生在await表达式内”的限制。 重载解析规则取决于同步或者异步上下文环境,在对应的环境中,编译器只选择一个函数重载。...这些函数似乎并不常见,所以我们相信作为引入 async/await 的一部分,这是一个可以接受源代码破坏。...为顶层代码的考量不会影响本提案中定义的 async/await 基本机制。 把 await 作为语法糖 提议把async函数作为 Swift 类型系统的核心部分,区分同步函数

    1.9K40

    Python:从头创建 Asyncio (2)

    在我探索 asyncio 的过程中,我起初并不太明白它的工作原理。但随着深入学习,我意识到 asyncio 实际上是在 Python 生成器的基础上增加了一层非常便利的封装。...例如,我在这里引入了一个休眠生成器,它会在指定的时间到达之前暂停任务的执行。这种机制之所以有效,是因为 sleep 函数会连续产生 yield,直到经过了设定的秒数,然后它将跳出 while 循环。...现在我们使用 task.iter.send(None) 替代 next(task.iter),这在使用 async/await 关键字时显得有些奇特,功能上是一致的。...尽管我偏爱这种方法, await 关键字不能与生成器函数一起使用——它需要是一个定义 await 魔术方法的对象或是一个协程函数。...同时,我们需要在那些使用了 await函数前加上 async 关键字,以表明这些函数是异步的,并且可以被其他代码等待执行。

    8710

    使用图解和例子解释AwaitAsync

    在Promise完成之后执行代码的唯一方法是通过then方法传入回调函数。 下图描绘示例的计算过程: ? Promise的计算过程。 调用“线程”不能等待Promise。...在Promise之后执行代码的唯一方法是通过then方法指定回调函数。 只有当Promise成功时,回调函数才能执行。 如果它失败(例如由于网络错误),回调函数将不会执行。...下图描述计算流程: ? 对于这样一个简单的例子,我们最终得到了2个嵌套的回调函数,并且必须使用Promise.all来同步并发Promise。...async function asyncF() { throw 'Error'; } Await 当我们产生承诺时,我们无法同步等待完成。 我们只能通过一个回调。...当我们使用await关键字。 它只能用于async功能,并允许我们同步等待Promise。

    1.4K20

    Node.js中常见的异步等待设计模式

    iffor 重试失败的请求 其强大之await处在于它可以让你使用同步语言结构编写异步代码。例如,下面介绍如何使用回调函数使用superagent HTTP库重试失败的HTTP请求。...我记得我第一次尝试这种模式与合作,我感到莫名其妙,它实际工作。但是,下面的就不能正常工作。请记住,await必须始终在async函数中,而传递给forEach()下面的闭包不是async。...使用async / await,你会发现自己不再使用助手函数(除了可能toArray()),因为用循环遍历游标for要容易得多: const mongodb = require('mongodb');...Promise.all(promises)); } Promise.all()函数接受一组承诺,并返回一个承诺,等待数组中的每个承诺解析,然后解析为一个数组,数组包含解析的原始数组中每个承诺的值。...Promise.all()并不是您可以并行处理多个异步函数的唯一方式,还有一个Promise.race()函数可以并行执行多个promise,等待第一个解决的承诺并返回承诺解决的值。

    4.7K20

    有效的只读属性

    最近被接受的提案 SE-0296 介绍通过和asyncawait来实现异步函数,但是没有指明计算属性和下标可以支持类似async这种异步效果。...任何对 属性 或 下标 的提及均是指成员的只读版本。而且除了特殊的指定,本文中同步,异步,async和sync定义均来自SE-0296. 效果是函数的可观察行为。...但是随着async函数的到来,completion-handler 参数出现异步函数中一去不复返。因此,拥有async的计算属性并不会违背现有的计算属性访问语法:这主要是类型系统中一个差别。...B:这位置看起来意义不大,因为效果说明符仅仅是函数类型的一部分,而不是其他类型的某部分。所以,放在这个位置会让大家很困惑,以为Int async throws是个类型,事实并不是。...async/await特性是专门为异步编程定制的,因此不用考虑异步属性不依赖特性的备选方案。同样,throws/try也是一样。

    1.8K60
    领券