从函数返回 Axios Promise

2024-02-08

有人可以解释一下为什么返回 Axios 承诺允许进一步链接,但在应用 axios 后返回then()/catch()方法不对?

Example:

const url = 'https://58f58f38c9deb71200ceece2.mockapi.io/Mapss'
    
function createRequest1() {
  const request = axios.get(url)

  request
  .then(result => console.log('(1) Inside result:', result))
  .catch(error => console.error('(1) Inside error:', error))

  return request
}

function createRequest2() {
  const request = axios.get(url)

  return request
  .then(result => console.log('(2) Inside result:', result))
  .catch(error => console.error('(2) Inside error:', error))
}

createRequest1()
.then(result => console.log('(1) Outside result:', result))
.catch(error => console.error('(1) Outside error:', error))

createRequest2()
.then(result => console.log('(2) Outside result:', result))
.catch(error => console.error('(2) Outside error:', error))
<script src="https://unpkg.com/[email protected] /cdn-cgi/l/email-protection/dist/axios.min.js"></script>

https://jsfiddle.net/nandastone/81zdvodv/1/ https://jsfiddle.net/nandastone/81zdvodv/1/

我知道 Promise 方法应该返回一个要链接的值,但是为什么这两个返回方法之间存在差异?


您的第一个示例返回原始承诺。你的第二个例子返回一个不同的承诺,通过调用创建的承诺catch.

两者之间的关键区别是:

  1. 在第二个示例中,您没有传递分辨率值,因此您返回的承诺then解决了undefined(返回值console.log).

  2. 在第二个示例中,您将拒绝转换为解决方案undefined(通过返回结果console.log out of catch). A catch不抛出或返回被拒绝的承诺的处理程序会将拒绝转换为解决方案。

承诺链的关键之一是它们改变了结果;每次致电then or catch创建一个新的 Promise,并且它们的处理程序可以在结果通过它们时修改向下游发送的内容。

通常的模式确实是返回链的结果,但链中的函数要么故意转换结果,要么将其传递。通常情况下,你不会有catch处理程序,除非在链的末端,除非您使用它来纠正错误条件(故意将拒绝转换为解决方案)。

如果您只想记录经过的内容,同时仍允许呼叫者看到它,但是did无论出于何种原因想要返回链的结果,您都可以这样做:

return request
    .then(result => { console.log(result); return result; })
    .catch(error => { console.error(error); return Promise.reject(error); });

或使用throw:

return request
    .then(result => { console.log(result); return result; })
    .catch(error => { console.error(error); throw error; });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从函数返回 Axios Promise 的相关文章

随机推荐

  • Jmeter 而控制器似乎没有将变量评估为数字

    我正在编写一个 jmeter 脚本 该脚本会不断加载数据 直到表达到指定的大小 我有一个 while 循环 其中有一个 HTTP 采样器来加载数据 然后是另一个带有 XPath 后处理器的 HTTP 采样器来检查表大小 它们调用两个不同的
  • get_dummies (Pandas) 和 OneHotEncoder (Scikit-learn) 之间的优缺点是什么?

    我正在学习不同的方法将分类变量转换为机器学习分类器的数字 我遇到了pd get dummies方法和sklearn preprocessing OneHotEncoder 我想看看它们在性能和使用方面有何不同 我找到了一个关于如何使用的教程
  • 树形视图闪烁?

    我开始知道 通过添加 TreeView BeginUpdate 将防止树视图闪烁 但是当我将其添加到我的项目中时 树视图的所有节点都会消失 任何人都可以告诉我为什么会发生这种情况 这是我使用 TreeView 的代码片段 BeginUpda
  • ios google登录,如何获取用户图片url?

    我正在研究 iOS Swift 谷歌登录 我在github上做了一个demo 我的演示项目 https github com tanggod GoogleSignIn git https github com tanggod GoogleS
  • 使用python删除某些文件

    我有一个 py 脚本 可以处理扩展名为 hgx 的文件 示例 test hgx 有很多这样的扩展名为 hgx 的文件 该脚本处理 test hgx 并创建一个新的 test bac hgx 并在重新运行时创建 test bac bac hg
  • 如何获取存储库 /network 的完整 github.com 可视化

    EDIT 这应该是给我母亲的礼物 如果需要的话 我会将它拖放并将一堆丝网印刷品缝合在一起 但是该资源必须位于网站上的某个地方 我相信至少这个网站上有人知道如何做到这一点 EDIT 所以我进一步研究了这个问题 发现如果你把 meta 放在网络
  • Windows 10 通用应用程序 - 类型同时存在于“Windows.Foundation.UniversalApiContract”中

    不知何故 我什至没有做任何事情 我在 Visual Studio 2015 中遇到很多错误 但我无法理解问题到底是什么 它说两个 Windows Foundation UniversalApiContract 库中都存在很多 类型 有人可以
  • 将 defer 与指针一起使用

    假设我有以下代码 func getConnection fileName string os File file err os Open fileName Check for error return file 我使用此函数打开一个文件 并
  • clang 对 C++ 11 lambda 的支持

    我有这个使用 lambda 的 C 11 代码 这是一个示例 include
  • 线程创建、CRT 和 DLL 是如何完成的?

    所以我知道 CreateThread 和 CRT 可能会导致内存泄漏 信号不起作用 应该使用 beginthread 或 beginthreadex 函数 在编写应用程序时这一切都很好 但是那些为其他应用程序编写 dll 等的人 无论是普通
  • django-mptt 引发 django.db.utils.IntegrityError:列“lft”中的空值违反了非空约束

    条件 Django 1 8 7 和 django mptt 0 8 0 有一个模型 class Tree mptt models MPTTModel name models CharField max length 120 unique T
  • AWS EB - 将所有流量重定向到 https

    我的nodejs应用程序部署在AWS EB上 我已经配置了 https 服务器并且工作正常 现在我需要将每个非 https 请求重定向到带有 www 的 https 作为前缀 如下所示 GET example com gt https ww
  • Flutter URL 启动器 Google 地图

    列表 dart import package flutter material dart import package url launcher url launcher dart class List extends StatefulWi
  • 算法渐近复杂度

    我想知道这个过程可以使用大 符号在以下算法中返回的最小值和最大值是多少 算法是 procedure F 1 n s 0 for i 1 to n j min max i A i n s s j return s 编辑 删除了原始答案 因为它
  • 我可以为 gtest 中的值参数化测试指定更好的名称吗?

    我在 gtest 中使用值参数化测试 例如 如果我写 INSTANTIATE TEST CASE P InstantiationName FooTest testing Values meeny miny moe 然后在输出中我看到测试名称
  • 延迟加载模块时生成错误

    在另一个模块中延迟加载模块时 出现构建错误 延迟加载在执行 ng 服务时工作得很好 角度版本 11 1 2 错误 错误 构建多个块时 必须使用 output dir 选项 而不是 output file 要内联动态导入 请设置 inline
  • 通过 c# 解析 csproj - 无法解析 ItemGroup

    我尝试从 csproj 文件中获取所有 dll 名称 但无法获取任何内容 因此 我尝试使用 liq 查询从 ItemGroup 标记中获取所有元素 var elem doc Descendants Project Where t gt t
  • 将消息放入azure队列

    我按照给出的详细信息将消息放入天蓝色队列中Azure Python SDK https github com Azure azure sdk for python 当我尝试将消息放入队列时 from azure storage import
  • 如何使用 Between 子句获取两个日期之间的数据?

    我在数据库中有日期字段 格式为2012 03 17 19 50 08 023 我想创建一个选择查询 它为我提供在March月 但我无法实现这一点 我正在尝试以下查询 select from OrderHeader where Convert
  • 从函数返回 Axios Promise

    有人可以解释一下为什么返回 Axios 承诺允许进一步链接 但在应用 axios 后返回then catch 方法不对 Example const url https 58f58f38c9deb71200ceece2 mockapi io