【问题标题】:How do I get axios response when it's inside of a Promise chain?当 axios 位于 Promise 链中时,如何获得响应?
【发布时间】:2020-01-17 15:56:05
【问题描述】:

我有一些我想要理解的 javascript 代码。我有一个返回 Promise 的函数,并且在 then 块之一中我有一个 axios.post(来自 axios 库)。当这个函数运行时,在控制台中我看到“在这里完成”,但我从来没有看到“后完成”。我认为这是因为函数在 axios.post 响应返回之前完成?那是对的吗?如果我还希望在控制台中显示“发布完成”,我需要做什么?

function X () {
  return new Promise((resolve, reject) => {
    if (x) {
      ...
      resolve();
    } else {
      ...
      reject();
    }
  }).then(() => {
    axios.post(
      url, 
      data
    ).then((response) => {
      ...
      console.log("post complete");
    });
  }).then(() => {
    ...
    console.log("finish here");
  });
}

【问题讨论】:

  • 很可能你的 axios 请求刚刚遇到了一个你没有发现的错误。

标签: javascript promise axios


【解决方案1】:

您不会将 axios 承诺返回到主承诺链。无论如何,你真的不应该嵌套这样的承诺;如果 then 或 catch 回调返回一个 Promise,它将冒泡到主链并且可以直接从那里链接。试试这个:

function X () {
  return new Promise((resolve, reject) => {
    if (x) {
      ///...
      resolve();
    } else {
      ///...
      reject();
    }
  })
  .then(() => axios.post(url, data))
  .then(response => {
    //...
    console.log("post complete");
  })
  .then(() => {
    ///...
    console.log("finish here");
  });
}

【讨论】:

  • axios 帖子的回调返回该承诺。 OP 没有,因为带有花括号的箭头函数不会隐式返回任何内容,而且它们也没有明确使用return。我还将帖子的.then 直接链接到主承诺链中,而不是嵌套它,因此更容易阅读。
  • 仅供参考,嵌套 .then() 回调 is 在延续需要访问前一个延续中声明的局部变量的情况下(例如 url 和 @987654326 @ 在这种情况下,如果它们在第一个 .then() 回调的主体中声明)
  • @PatrickRoberts 我会说在这种情况下,如果无法将这些变量重构到更高的范围,更好的解决方案是将它们传递给Promise.all 的下一个回调。正如 OP 所发现的那样,这样的嵌套链使其更难遵循 :) (或者,你知道,也许最好跳过所有这些并直接跳转到 async/await :D)
  • @IceMetalPunk 将变量显式传递给下一个延续或在闭包中捕获它们是样式偏好的问题。两者都是有效的解决方案,并且任何一个都是可行的方法这一事实并不会使另一个失去资格。但是,是的,async / await 是用于链接承诺和隐式捕获带有闭包的变量(即嵌套延续)的语法糖。
  • 我并不是说它“不合格”——它工作得很好,很明显。它只是更难阅读,因为它会导致回调金字塔。更难阅读使错误更容易潜入 - 就像这个问题所示,就像一个人所做的那样:) 一切等效的东西都是一个偏好问题,但有些东西比其他东西更难阅读。
猜你喜欢
  • 2018-12-29
  • 2019-01-19
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2018-09-27
  • 2020-08-10
  • 2019-05-05
  • 2021-11-05
相关资源
最近更新 更多