【问题标题】:Chaining three different async functions链接三个不同的异步函数
【发布时间】:2021-10-14 11:49:08
【问题描述】:

我有三个异步函数,但第三个函数在第二个函数解析之前正在运行。这里有什么问题?

 async function getSet () {
//get settings from asyncstorage and setstate
}

 async function pairs () {
//fetch data and set another state
}

 async function fetchIt () {
//fetch another data and set a third state
}
useEffect(() => {
    getSet()
      .then(pairs())
      .then(fetchIt())
      .then(() => {
        setLoading(false);
      });
  }, []);

fetchIt() 在pairs() 之前运行

【问题讨论】:

标签: javascript react-native asynchronous promise


【解决方案1】:

调用未正确链接。为了更简单,使用async await:

  useEffect(() => {
    (async function () {
      await getSet();
      await pairs();
      await fetchIt();
      setLoading(false);
    })();
  }, []);

如果每个调用都依赖于最后一个调用的结果,它看起来像

const r1 = await getSet();
const r2 = await pairs(r1);
// etcetera

【讨论】:

  • 收到错误“效果函数不能返回除用于清理的函数之外的任何内容”
  • 解释一下 - React 正在检查 useEffect 函数返回的内容,因为返回的值可以是一个清理函数。然而,异步函数总是返回一个 Promise,因此我们需要将它包装在另一个函数中以停止返回 Promise。 ?
  • 不,@jfriend00 你不能。这就是我开始使用的,但由于我忘记了 React 的精妙之处而不得不对其进行修改。
  • 请看上面的cmets。 2 和 4。
  • 好吧,这对 React 来说真的很不方便。必须在async 之前设计。
【解决方案2】:

你没有正确地链接'then's。他们也必须回报一个承诺。阅读更多here

const getSet = async() => {
  //get settings from asyncstorage and setstate
  return new Promise((resolve, reject) => {
    resolve('getSet');
  });
}

const pairs = async() => {
  //fetch data and set another state
  return new Promise((resolve, reject) => {
    resolve('pairs');
  });
}

const fetchIt = async() => {
  //fetch another data and set a third state
  return new Promise((resolve, reject) => {
    resolve('fetchIt');
  });
}

getSet()
  .then(response => {
    console.log(response);
    return pairs();
  })
  .then(response => {
    console.log(response);
    return fetchIt();
  })
  .then(response => {
    console.log(response);
    // setLoading(false);
  });

【讨论】:

  • 虽然你的代码在技术上比 OP 更正确 - 你的解释是错误的 - .then 总是返回一个承诺,你不需要在 .then 回调中返回一个承诺......所以为更正的代码竖起大拇指(老实说,这不是最好的解决方案),但要努力解释
  • 啊,对了,感谢您指出这一点。也许它可以作为如何不链接承诺的一个例子。 ;)
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多