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

await function()不等待函数完成,因此返回未定义的结果

await function() 可能不等待函数完成的原因通常是因为 await 关键字被用在了非异步函数(async function)内部,或者是因为被调用的函数本身并不是返回 Promise 对象的异步函数。

基础概念

  • 异步函数(Async Function):在函数声明前加上 async 关键字,这样的函数会返回一个 Promise 对象。当函数内部的 await 表达式等待的 Promise 完成时,异步函数才会继续执行。
  • await 关键字:只能在 async 函数内部使用,用于等待一个 Promise 完成(或拒绝),并返回该 Promise 的结果。

相关优势

使用 awaitasync 可以让我们以同步的方式编写异步代码,这使得代码更加直观和易于理解。

类型

  • 异步函数:使用 async 关键字声明的函数。
  • Promise:表示一个异步操作的最终完成(或失败)及其结果值的对象。

应用场景

当需要处理网络请求、文件读写等可能会阻塞主线程的异步操作时,使用 awaitasync 可以使代码更加清晰。

问题原因

  1. 非异步函数中使用 await:如果一个函数没有被声明为 async,那么在其中使用 await 会导致语法错误。
  2. 调用非 Promise 返回值的函数:即使在一个 async 函数中使用了 await,如果被调用的函数不是返回 Promise 对象的异步函数,await 也会立即返回该函数的执行结果,而不是等待。

解决方法

确保 await 关键字只在 async 函数内部使用,并且被 await 的表达式必须是一个返回 Promise 的异步函数。

示例代码

错误的用法:

代码语言:txt
复制
function fetchData() {
  let result = await fetch('https://api.example.com/data'); // SyntaxError: await is only valid in async functions and the top level bodies of modules
  return result.json();
}

正确的用法:

代码语言:txt
复制
async function fetchData() {
  try {
    let response = await fetch('https://api.example.com/data'); // 正确使用 await 在 async 函数中
    let result = await response.json();
    return result;
  } catch (error) {
    console.error('Error fetching data:', error);
    throw error;
  }
}

参考链接

确保在编写代码时遵循这些原则,可以避免 await 不等待函数完成的问题。

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

相关·内容

用 awaitasync 正确链接 Javascript 中的多个函数

这是连接多个函数的工作代码,等待解决所有问题,然后 then 发送结果。...但是你还需要在它之外等待(即 let y = await myFunction() )或它实际上不会等待。这个调试是非常烦人的。...我们不知道从 Firestore 获取内容需要多长时间,因此它是 async 的,我们需要运行接下来的两个函数并返回(或以 promise 解析)courseEmail 。...最后,在运行 saveToCloudFirestore() 和 sendEmailInSendgrid() 并返回它们的值之前,不能发送 res.send(),否则我们的整个云函数将在工作完成之前中断。...为此,我们将 saveToCloudFireStore() 和 sendEmailInSendgrid() 响应(它们返回的内容)保存到变量中,其唯一目的是标记上述函数何时完成。

6.3K30

深入理解JavaScript中的同步和异步编程模型及应用场景

异步代码 异步代码是指不按照代码的顺序执行,而是在某个事件触发之后才会执行。也就是说,异步代码不会阻塞代码的执行,可以在等待某些操作完成的同时继续执行其他代码。...由于网络请求是异步的,因此在等待服务器返回数据的过程中,JavaScript可以继续执行其他代码。 二、同步代码和异步代码的应用 1....代码中,首先定义了一个异步函数getAsyncData,该函数使用await关键字等待异步操作完成后返回数据。...,使用await关键字等待异步操作完成后返回数据。...同步代码按照代码的顺序依次执行,必须等待前一个代码块执行完毕后才能执行下一个代码块;而异步代码不按照代码的顺序执行,可以在等待某些操作完成的同时继续执行其他代码。

84142
  • 深入理解JavaScript中的同步和异步编程模型及应用场景

    异步代码异步代码是指不按照代码的顺序执行,而是在某个事件触发之后才会执行。也就是说,异步代码不会阻塞代码的执行,可以在等待某些操作完成的同时继续执行其他代码。...由于网络请求是异步的,因此在等待服务器返回数据的过程中,JavaScript可以继续执行其他代码。二、同步代码和异步代码的应用1....由于网络请求是异步的,因此在等待服务器返回数据的过程中,JavaScript可以继续执行其他代码。三、同步代码和异步代码的区别同步代码和异步代码的主要区别在于它们的执行顺序和效率。1....代码中,首先定义了一个异步函数getAsyncData,该函数使用await关键字等待异步操作完成后返回数据。...同步代码按照代码的顺序依次执行,必须等待前一个代码块执行完毕后才能执行下一个代码块;而异步代码不按照代码的顺序执行,可以在等待某些操作完成的同时继续执行其他代码。

    73910

    二十三期:一道面试题和三个个知识点

    ) async 和 await 的用法 let 声明的变量存在TMD暂时性死区的问题,所以已声明但未被赋值的变量如果直接使用,会报未定义的错。...因此第二个参数仅仅表示最少延迟时间,而非确切的等待时间。...以往我们写promise的时候,需要在then的返回值中才能捕获我们想要的结果。 但是await可以直接捕获我们想要的结果。...简单来说:await 关键字使JavaScript运行时暂停于此行,允许其他代码在此期间执行,直到异步函数调用返回其结果。一旦完成,我们的代码将继续从下一行开始执行。...一旦服务器返回的响应可用,解析器就会移动到下一行,从而创建一个Blob。Blob这行也调用基于异步promise的方法,因此我们也在此处使用await。

    64320

    使用图解和例子解释Await和Async

    回调函数本身可以返回Promise,因此我们可以链式调用Promise。...例如,假设我们需要编写一个程序: 发起http请求,等待完成,打印结果; 返回之后进行其他两个HTTP的并行调用; 当它们都完成时,打印结果。...因此,我们需要通过Promise.all(第11行)将它们组合成一个单一的Promise,当它们完成时,它们就可以正确调用。 然后我们传入了另一个打印结果的回调(第14-15行)。...每个async函数都返回一个Promise。 因此,JavaScript解释器知道async函数中的所有操作都将被封装在Promise中并异步运行。...因此,等待Promise返回值。 如果我们等待失败的Promise,这将导致异步功能中的异常。

    1.4K20

    JavaScript 编程精解 中文第三版 十一、异步编程

    但是,我们希望单个程序在等待网络请求时能做一些事情,这并没有什么帮助。 异步 在同步编程模型中,一次只发生一件事。 当你调用执行长时间操作的函数时,它只会在操作完成时返回,并且可以返回结果。...第二个线程可以启动第二个请求,然后两个线程等待它们的结果返回,之后它们重新同步来组合它们的结果。 在下图中,粗线表示程序正常花费运行的时间,细线表示等待网络所花费的时间。...但那不是then方法所做的一切。 它返回另一个Promise,它解析处理器函数返回的值,或者如果返回Promise,则等待该Promise,然后解析为结果。...由于这种链条通过注册处理器来创建,因此每个链条都有一个成功处理器或与其关联的拒绝处理器(或两者都有)。 不匹配结果类型(成功或失败)的处理器将被忽略。...Promise.all返回一个Promise,等待数组中的所有Promise完成。

    2.7K20

    结构化并发

    想象有某个函数,它在 CPU 上做了大量的工作。我们想通过把工作分散到两核来优化它:因此现在函数创建一个新线程,在每个线程做一半的工作,然后让原来的线程等待新线程完成。...一个已完成的任务没有其他工作要做,并且也从来不会进入其他状态。 代码可以用各种方法等待任务完成,最显著的是使用await来标记该段代码。 我们讨论的对任务和异步函数的执行相比同步函数更复杂。...函数返回或者抛出错误,它们将会以某种方式完成执行操作。...任务 handle 可以用来等待任务结果,例如: let dinner = try await dinnerHandle.value 即使没有保存任务 handle 的使用,任务也会运行完成,所以没有必要去保存任务...在任务组内查询任务 next操作允许从任务组创建的任务中获取结果。该方法返回任务组中任务的结果,无论是正常的结果还是抛出的错误。

    3.1K40

    c++20的协程学习记录(一): 初探co_await和std::coroutine_handle

    一旦阅读了整个消息,可能在多次调用之后,就可以解析该消息并从更高的抽象层调用另一个回调,依此类推。编写这种代码很痛苦,因为必须将代码分解为一堆不同的函数。它们是不同的函数,所以不共享局部变量。...2.1 协程 粗略地说,协程是可以互相调用但不共享堆栈的函数,因此可以在任何时候灵活地暂停执行以进入不同的协程。C++ 协程经常使用术语future和 Promise来解释。...这里注意到,步骤 3 中的方法返回时不会将控制权返回给协程。仅当调用步骤 2 中的可调用函数时,协程才会恢复执行。...... ==> main1 leave 第三个现象是 main函数退出时,counter function还没有执行完 2.2.3 初步结论 await_suspend() 当第一次执行到表达式时 co_await...类型a必须支持某些方法,有时称为“可等待”对象或“等待者”。 这里的await_suspend()每次被调用时都会存储协程句柄 *hp_=h,但该句柄不会在调用过程中发生变化。

    1.4K10

    了解关键区别:await vs return vs return await

    它允许我们以更加同步和可读的方式编写异步代码,从而更容易处理 Promise 和执行非阻塞操作。当调用异步函数时,它会返回一个 Promise,该 Promise 解析为函数的最终结果。...让我们从这个异步函数开始: async function waitAndMaybeReject() { // 等待 1s await new Promise(r => setTimeout(r...因为我们没有 await 或者 return 异步函数 waitAndMaybeReject() 的结果,因此我们对它没有作出任何反应,像这样的代码通常都是错误的。...由于通过 return waitAndMaybeReject,我们延迟了其结果,因此我们的 catch 代码块永远不会运行。...如果上述内容看起来令人困惑,那么将其视为两个独立的步骤可能会更容易理解: async function foo() { try { // 等待 waitAndMaybeReject() 的结果结算

    40310

    JavaScript 异步编程入门

    这种模式允许我们在异步任务完成后进行处理,而不阻塞主线程。 在 JavaScript 中,回调函数通过结合浏览器或 Node.js 的事件循环机制来实现异步行为。...async/await 的基本用法 async 函数:声明一个 async 函数,它会自动返回一个 Promise。...即使没有显式返回 Promise,async 函数默认会把返回值封装成一个 Promise。 await 表达式:用于等待一个 Promise 的结果。...它们简化了 Promise 的链式调用,消除了嵌套结构。可以把 await 视作一个暂停点,等待 Promise 完成(无论是成功还是失败),使得异步代码的处理更符合程序的执行逻辑。...因此,异步编程通过不阻塞主线程来解决这个问题,使得 JavaScript 能够高效处理 I/O 密集型任务,保持应用的流畅运行。

    9810

    如何正确合理使用 JavaScript asyncawait !

    await 作用是什么 从 MDN 了解到: await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,await 可以等任意表达式的结果)。...await bookModel.fetchAll() 会等待 fetchAll() 直到 fetchAll() 返回结果。...有时这可能是致命的:如果 BookModel 被包含在一系列函数调用中,其中一个调用者吞噬了错误,那么就很难找到这样一个未定义的错误。 让函数返回两个值 另一种错误处理方法是受到Go语言的启发。...它允许异步函数返回错误和结果。...使用 .catch 这里介绍的最后一种方法就是继续使用 .catch()。 回想一下 await 的功能:它将等待 promise 完成它的工作。

    3.3K30

    JavaScript中的asyncawait

    async 是一个修饰符,async 定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数。...从字面上来看,async是“异步”的简写,await译为等待,所以我们很好理解async声明function是异步的,await等待某个操作完成。...按照语法说明,await等待的是一个Promise对象,或者是其他值(也就是说可以等待任何值),如果等待的是Promise对象,则返回Promise的处理结果;如果是其他值,则返回该值本身。...并且await会暂停当前async function的执行,等待Promise的处理完成。...3. async和await简单应用 上面已经说明了 async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,

    1.6K10

    ES2017 异步函数的最佳实践(`async` `await`)

    在调度任务时,程序可以(1)阻止执行直到任务完成,或者(2)在等待先前计划的任务完成时处理其他任务 (后者通常是更有效的选择。...虽然我们的优化可以在这里结束,但我们仍然可以进一步优化! 我们不需要立马等待 "thenable"的返回结果。相反,我们可以暂时将它们作为承诺存储在一个变量中。...`; } 就像这样,我们通过在等待异步任务完成的同时执行同步工作,进一步减少了函数的空闲时间。 作为通用的指导原则,必须尽早安排异步I/O操作,但要尽可能晚地等待。...(因为我们通过接受 await 函数返回的结果,async 中 的 return 和 promise 的 resolve 等同效果,因此可以把 return 看作是 resolved 的包装,译者注)(...因此,将return和await结合使用(通常)是多余的结果,即多余地包装和拆开已解决的promise。首先,await关键字将解开解析的值,然后将其立即由return关键字再次包装。

    1.8K30

    50 种 ES6 模块,面试被问麻了

    引擎处理完模块代码后,看起来是这样的: function foo() {} foo = 25; export { foo as default } 因此,测验结果就是 number 。...顶层 await 使模块能够像大型异步函数一样运作:通过顶层 await,ECMAScript 模块(ESM)可以等待资源,导致导入它们的其他模块在开始评估其主体之前必须等待。...模块中的代码不会被执行,直到所有导入模块中的代码都被执行,只是现在这包括等待模块中所有等待的承诺被解决。...由于 import(module) 返回的是一个 promise,为了修正测验代码,我们必须在导入调用之前添加 await 关键字: if (shouldLoad) { ({ num } = await...那么,为什么两个对象相乘时会出现如此奇怪的错误,而不是我们习惯的 NaN 呢? 这是因为返回的对象具有 null 原型。因此,它没有用于将对象转换为基元的 toString() 方法。

    15300

    那些消除异步的传染性的方法到底可不可取?

    Suspense内部会捕获promise错误,一旦捕获了就会等待promise完成,在等待期间就会渲染fallback内容,直到promise完成再重新去渲染,也就是会重新调用一次这个函数组件得到新的内容...接下来看下实现思路吧 当一个 fetch 请求返回 promise 时,需要使用 await 来获取数据。而一旦使用了 await,当前函数就必须是 async 函数。...拿到结果后我们把它放在一个缓存中,接着再去恢复整个调用链的执行。再执行fetch时,结果已经缓存在cache了,取出数据就可以直接交付不用等待了从而变成了同步函数。...抛出的错误为发送请求返回的Promise对象,目的是为了在请求完成后再去恢复调用。...定义了一个 cache 对象来记录异步操作的状态和结果。 newFetch 函数根据 cache 的状态来决定直接返回结果或执行原始 fetch 并处理其后续的解析和状态更新。

    40410

    await 只在 async 函数中工作

    它可以放在函数前,就像这样: async function f() { return 1; } 函数前的 “async” 意味着一件简单的事情:函数总是会返回 promise。...例如,上述代码中返回一个带有结果 1 的 resolved promise,我们可以进行测试: f().then(alert); // 1 …我们可以显式的返回一个 promise,结果相同: async...function f() { return Promise.resolve(1); } f().then(alert); // 1 因此, async 确保函数返回一个 promise,并在其中封装非...Await // 只在 async 函数中工作 let value = await promise; await 关键字使 JavaScript 等待,直到 promise 得到解决并返回其结果...我们强调: await 字面上是让 JavaScript 等待 promise 完成,然后继续处理结果。这并不会消耗 CPU 资源,因为引擎可以同时处理其他任务:执行其他脚本,处理事件等。

    1.5K10

    Promise与AsyncAwait:异步编程的艺术

    /data'); // 等待fetch请求完成 const data = await response.json(); // 再等待解析JSON数据 console.log('Data...', error); } } // 调用异步函数 fetchInfo(); 在上面的代码中,async关键字声明了一个异步函数,await关键字用于等待Promise的结果。...深入Async/Await try/catch块内的await 在async函数内部,任何返回Promise的表达式都可以放在await后面,它会暂停函数执行,直到Promise完成。...('Fetch failed:', error); } } Async/Await与Promise的转换 Async函数实际上会返回一个Promise,这意味着我们可以用Promise的方法来处理其结果...Async/Await 则引入了新的语法特性,使得异步代码看起来更像是同步代码,通过async关键字标记函数,并在函数内部使用await关键字等待Promise的结果。

    17710

    跨越时空的对白——async&await分析

    曾经大胆猜测,async...await...可以强行拉长try...catch...作用域,让调用函数的生命周期可以尽量延长,以至于可以等待直到异步函数执行完成,在此期间如果异步过程出现异常,调用函数就可以捕捉到...这是Generator函数不同于普通函数的另一个地方,即执行它不会返回结果,返回的是指针对象。...第二个next方法带有参数2,这个参数可以传入Generator函数,作为上个阶段异步任务的返回结果,被函数体内的变量y接收。因此,这一步的value属性,返回的就是2(变量y的值)。...co函数返回一个Promise对象,因此可以用then方法添加回调函数。...async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。 更广的适用性。

    1.2K21
    领券