为什么一个函数在调用另一个异步函数时是异步的?

theju112t

我以为我了解如何使用 async 和 await 直到我看到下面的代码片段。

所以有一个 onInput 事件处理函数附加到电影输入文本框。其中称为fetchData异步函数,它使用 await 关键字来等待来自 axios.get 函数的结果。

我的问题是,为什么我们需要使 onInput 函数也异步?我的意思是,fetchData 函数是异步的。这意味着,它将等到 axios.get 被解析,并且执行将暂停直到 axios.get 被解析。所以当行 const movies = fetchData(event.target.value); 执行,将执行 fetchData 函数,该函数将在 await axios.get 语句上暂停。那么为什么我们需要在调用 fetchData 时使用 await 并使 onInput 异步?

const fetchData = async(searchTerm)=>{
    const results =  await axios.get('http://www.omdbapi.com/', {
    params:{
        apikey:'d9835cc5',
        s: searchTerm
        }

    });
    return results.data.Search;
}

    const movieInput = document.querySelector('input');
    
    
    const onInput = async event => {
        const movies = await fetchData(event.target.value);
        console.log(movies);
    }
    
    movieInput.addEventListener('input', onInput);
拖拉机

我的意思是,fetchData 函数是异步的。这意味着,它将等到 axios.get 被解析,并且执行将暂停直到 axios.get 被解析。

这个概念隐藏了许多可能令人困惑的细节,例如使用回调函数恢复暂停的执行。

  • async 函数不会暂停调用者的执行。

    相反,它们返回一个承诺,该承诺将使用执行async函数体在语法上返回的值进行解析需要明确的是,显然从async函数体内返回的值不会直接返回给调用者——调用者会得到一个承诺。

  • 执行时,await 操作符会设置回调,以在其操作数承诺变得稳定时进行回调。有效它调用then其承诺的方法操作数来提供一组onfulfilledonrejected回调,存储当前执行上下文在存储器中并返回到事件循环之前。

    当它收到来自 promise 结算的回调时,await操作符会恢复它之前保存的执行上下文。如果等待的承诺被拒绝,则await抛出拒绝原因。如果已完成,则await继续执行并返回作为执行await操作符的结果的承诺的已完成值

从历史上看await现在从来都不是保留关键字——在 ES3 中没有提到,在 ES6(ECMAScript 2015)中未来的保留关键字,而是在 2021 年 5 月的 ECMAscript 当前草案中的保留字。

因此,为了保持与 Web 上的代码的兼容性,await仅当它出现在async函数内时才被识别为运算符- 使其可用作async函数体之外的标识符

同样,该async关键字在历史上不是保留的,但通过要求将其使用在可能会在以前版本的 JavaScript 中产生意外标识符错误的位置,可以在没有可比性问题的情况下引入。function关键字之前或箭头函数表达式之前的含义

最后,您需要声明onInputasync函数,因为await它在其体内用作运算符。如果没有async声明,await将被视为标识符而不是运算符的名称。

作为旁注,由 返回的承诺onInput正在被丢弃,并且可能会以当前形式生成未捕获的承诺拒绝错误。


为了回答“为什么完全await需要在onInput函数中使用?”这个稍微不同的问题,返回的值fetchData是一个挂起的承诺。为了设置moviesresults.data.Search内获得fetchData,需要等待返回的promise的值。使用async/await是这样做的一种方式。另一种方法fetchData通过调用其then方法向从其返回的承诺添加一个履行处理程序

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在另一个内部调用一个异步函数的最佳方法是什么?

如何在另一个异步函数中调用异步函数

被阻止的Python异步函数调用也会阻止另一个异步函数

反应本机调用异步函数并在另一个异步函数中使用return

在redux-thunk中在另一个内部调用一个异步函数

使用RxJS如何缓冲函数调用,直到解决了另一个异步函数调用

为什么在调用另一个函数时不能将一个函数定义为参数?

C#,从调用另一个异步函数的函数返回字符串?

异步函数在另一个函数中调用时不等待 Promise

在另一个函数中调用异步函数上升 TypeError: next is not a function

【Python】与不同类中的另一个函数调用异步函数?

另一个窗口中的异步函数

在另一个函数中使用异步

在调用 nodejs 中的另一个方法之前运行 n 个异步函数

如何让一个单独的同步函数等待另一个异步函数?

你为什么要允许从另一个调用一个构造函数?

为什么在调用另一个函数时此char数组会更改值?

Flutter无法从另一个类调用异步函数

javascript中的异步函数,内部有另一个调用

在另一个文件中调用异步函数并在那里使用 .then

如何通过另一个异步函数内部的异步函数遍历数组?

异步函数为另一个异步函数存储数据

从另一个函数调用函数时出错

如何在 AngularJS 中将数据从一个异步函数传递到另一个异步函数

如何使用从一个异步函数到另一个异步函数的结果

在另一个内部运行一个异步函数

为什么不从另一个函数中调用一个函数而不是使用回调呢?

在递归函数中调用另一个函数会导致错误。为什么?

为什么使用模拟类中另一个函数调用的函数的测试失败?