【问题标题】:Callback function returning promise instead of the value回调函数返回承诺而不是值
【发布时间】:2021-09-30 00:22:19
【问题描述】:

我正在使用 fetch 从 json 文件中获取数据。在 .then() 中,我调用回调来处理该数据,然后最终从回调中返回最终值。问题是,当我返回时,它返回的是一个承诺而不是最终值。我查看了其他类似的问题,并认为我已经掌握了异步概念,但我仍然坚持这一点。我有什么遗漏吗?

const func = (callback) => {
  fetch('https://asdf.json')
    .then(response => {
      return response.json();
    })
    .then(data => {
      return callback(data)
    }
}
const callBack = (parsedData) => {
  //do something to get finalValue
  return finalValue
}

func(callBack);

我应该补充一点,我尝试只调用 callback(data) 而不返回,但这只是返回未定义。

【问题讨论】:

  • 你试图让哪个函数返回一个非承诺值? func,还是callBack?
  • @NicholasTower 我猜实际上是 func() 。我可以展开回调,只需在 .then() 中保留获取 finalValue 的步骤,但它会返回相同的内容。
  • func 不可能返回最终值。它还不存在。你能做的最好的就是回报一个承诺。即func的第一行应该是return fetch('https://asdf.json')。其余的行应该能够保持不变。
  • @NicholasTower 我明白了。是的,这确实返回了一个承诺。有没有办法获得 finalValue 呢?也许来自回调?
  • 为什么要使用回调?在这种情况下是多余的。你可以直接使用 Promise。 const func = (callback) => { fetch('https://asdf.json') .then(response => { return response.json(); }) .then(data => { return callback(data) } } func().then(finalValue => ...)

标签: javascript json asynchronous fetch asynchronous-javascript


【解决方案1】:

fetch 方法返回一个 Promise,因此您必须使用 async/await 或 then() 才能使其正常工作。 例如:

const func = (callback) => {
   return fetch('asdf.json')
      .then(response => {
        return response.json();
      })
      .then(data => {
        return callback(data)
      })
  }
  const callBack = (parsedData) => {
    //do something to get finalValue
    return parsedData;  
  }
  
 const main = async () => {
    console.log(await func(callBack));
 }

 main();

使用 then():

const func = (callback) => {
   return fetch('asdf.json')
      .then(response => {
        return response.json();
      })
      .then(data => {
        return callback(data)
      })
  }
  const callBack = (parsedData) => {
    //do something to get finalValue
    return parsedData;  
  }
  
  func(callBack).then(response=> {
      console.log(response);
  })

【讨论】:

  • 谢谢你,控制台日志有效,但是有没有办法返回它呢?目前,它返回的是一个 Promise 对象,而不是实际结果。
  • fetch 函数如何返回一个promise,你必须等待promise 解析得到最终值。所以,你想要的方式是不可能的。使用 await 或 then() 有什么问题?这是使用此类东西的常用方法。
  • @ternt 不,没有办法立即return 获取响应稍后将带来的值。在实际需要值的地方使用.then()await
  • 我已经尝试了两种方法,但我仍然无法返回值。我认为你是对的,可能不可能这样做,但我只是想确定一下。谢谢!
猜你喜欢
  • 2018-12-22
相关资源
最近更新 更多