前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js如何返回异步函数结果

js如何返回异步函数结果

原创
作者头像
IT工作者
发布2022-01-01 10:53:59
6.2K0
发布2022-01-01 10:53:59
举报
文章被收录于专栏:程序技术知识程序技术知识

假设您有这样一个问题:您正在进行一个异步调用,并且需要从原始函数返回该调用的结果。

像这样:

代码语言:javascript
复制
const mainFunction = () => {
  const result = asynchronousFunction()
  return result
}

但是,异步函数()在其中执行一些异步调用(例如fetch()调用),并且不能直接返回结果值。也许在内部,它需要等待一个承诺,或者一个回调。是这样的:

代码语言:javascript
复制
const asynchronousFunction = () => {
  return fetch('./file.json').then(response => {
    return response
  })
}

该如何解决这个问题呢?

async/await是最直接的解决方案。你使用的是await关键字,而不是基于promise的方法,就像我们以前使用的:

代码语言:javascript
复制
const asynchronousFunction = async () => {
  const response = await fetch('./file.json')
  return response
}

在这种情况下,在mainFunction中,我们需要将async添加到函数签名中,并在调用asynousfunction()之前等待:

代码语言:javascript
复制
const mainFunction = async () => {
  const result = await asynchronousFunction()
  return result
}

现在返回一个promise,因为它是一个async函数:

代码语言:javascript
复制
mainFunction() //returns a Promise

所以为了得到结果,你可以使用IIFE这样调用:

代码语言:javascript
复制
(async () => {
  console.log(await mainFunction())
})()

代码看起来像您从其他语言中使用的同步代码,但它是完全异步的。

另一种方法是使用回调。但是在使用async/await时,我们可以只修改异步函数()代码,在这种情况下,我们必须这样做

  1. 修改?asynchronousFunction()?代码
  2. 修改mainFunction()?代码
  3. 修改调用代码

这是一个例子。异步函数()接收一个新函数作为参数,我们称之为回调。调用它传递响应对象:

代码语言:javascript
复制
const asynchronousFunction = callback => {
  return fetch('./file.json').then(response => {
    callback(response)
  })
}

这个函数由mainFunction传递

代码语言:javascript
复制
const mainFunction = () => {
  const callback = result => {
    console.log(result)
  }

  asynchronousFunction(callback)
}

最后一个难题是调用mainFunction的函数。因为我们不能直接从mainFunction返回响应,因为我们是异步获取的,所以调用函数必须改变处理它的方式。

因此,代替使用const result = mainFunction(),我们可以这样:

代码语言:javascript
复制
const callbackFunction = result => {
  console.log(result)
}

const mainFunction = callback => {
  asynchronousFunction(callback)
}

//call the code

mainFunction(callbackFunction)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com