Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从异步/等待函数正确返回结果?_Javascript_Reactjs_Async Await - Fatal编程技术网

Javascript 如何从异步/等待函数正确返回结果?

Javascript 如何从异步/等待函数正确返回结果?,javascript,reactjs,async-await,Javascript,Reactjs,Async Await,我已经使用async/await函数几个月了,我的所有代码都正常工作了,但是,我不完全理解它,我可以用一些智慧的话 在我下面的代码中,我有一个异步函数,我的问题是。。。为什么它返回的是承诺而不是我期望的价值?更重要的是,获得我想要的价值的正确方法是什么 getName = async () => { const request = await fetch(apiUrl) const data = await request.json() return data

我已经使用async/await函数几个月了,我的所有代码都正常工作了,但是,我不完全理解它,我可以用一些智慧的话

在我下面的代码中,我有一个异步函数,我的问题是。。。为什么它返回的是承诺而不是我期望的价值?更重要的是,获得我想要的价值的正确方法是什么

  getName = async () => {
    const request = await fetch(apiUrl)
    const data = await request.json()

    return data.response.name
  }
我稍后调用该函数

const name=getName()

但是,
name
是一个承诺,而不是名称

我已经查了很多次了,它从来没有坚持过。我希望用我自己的例子,如果有人能解释它给我,所以我完全理解它将最终坚持我

编辑-在回复@Paulpro时,我已将我的问题更新到下面

假设异步函数没有问题,问题是如何存储值

const name = getName()
“名字”现在是一个承诺,所以我通常会这样做

getName().then(name => setName(name))
但是如何使const name==返回的名称呢

如何使const name==返回的名称

通过使用
const name=await getName()

这意味着您必须在
async
函数中使用它

因此,您的方法使用:

getName().then(name => setName(name))
这很可能是最好的方法,但这实际上取决于代码的其余部分

我的意思是你可以这样做:

let name;

getName = async () => {
  const request = await fetch(apiUrl)
  const data = await request.json()

  name = data.response.name;
}
let name = 'Loading...';
当(如果)两个异步请求都完成时,
name
变量将产生结果。但这并不能保证时间。根据应用程序的不同,如果按如下方式初始化变量,则可能没有问题:

let name;

getName = async () => {
  const request = await fetch(apiUrl)
  const data = await request.json()

  name = data.response.name;
}
let name = 'Loading...';

你已经用正确的方法做了。JavaScript函数同步返回,因此不能返回异步获得的值;那就是时间旅行。您所能做的最好的事情就是返回一个承诺。您不能从异步代码同步分配并能够立即使用它。您必须这样做,并在某个回调中使用它,或者在另一个异步函数中使用赋值,然后
await
它,例如
name=await getName()
我想您不能这样使用(您希望的方式),您希望它的行为像一个同步函数,但不幸的是它是一个异步函数。因此,我想不能打破固有的规则。异步(无论是否使用async/await)就像病毒一样。一旦你使用它(你必须为异步任务,比如AJAX),它就会感染所有使用它的代码——你无法治愈它,你只需要接受itOk——我‘得到’你所有的答案。我认为您是对的,带有
getName().then(name=>setName(name))
的函数是合适的,因为将它放在异步函数中会产生副作用。这样,
getName
保持了一个纯函数,可以在其他地方使用,并且可以在函数外部处理响应。(我希望我对我刚才所说的有信心-lol)实际上,我刚刚意识到我的
getName()
函数不能是纯函数,因为它正在进行一个它无法控制的API调用。然而,它至少不会改变任何外部变量,这正是我的目标。我将所有内容都放在try/catch中,这样它要么返回“name”值,要么返回“error”消息。@Ronald是的,最好不要在
getName()
函数中变异外部变量,该函数应保持其名称的真实性,只需获取名称并返回即可。听起来您对代码质量的考虑相当清楚。您也可以再次使用wait,例如
setName(wait getName())
,但这需要在另一个
async
函数中,因为您不能在一个函数之外使用wait。不管怎样,这通常是您想要的。@Ronald无论哪种方式,您都不需要修改getName,并且您不应该在getName中指定自由变量,这是正确的。