对 Promise 中 thenable 回调的工作方式感到困惑吗?

2024-01-10

我是 JS 的新手,正在学习 Promise。我想展示的代码摘录是这样的

promisedFunction.then(data=>console.log(data))

或者简单地

promisedFunction.then(console.log)

这相当于前面的代码摘录。问题是如何可能只使用then(console.log)代替then(data=>console.log(data))?这是否意味着我们可以在thenable回调中省略从promise传递的数据?


data=>console.log(data)是一个函数,它接受一个参数并使用传入的参数调用一个方法。

如果你通过了console.log它将执行相同的方法并仍然传递相同的参数。

实际上,您正在删除额外的函数调用 - 稍微更抽象一点,想象一下:

//some function `f`
const f = x => x + 1;

//different function `g` that just forwards the call to `f`:
const g = x => f(x);

console.log(g(41)); //42

的定义g只是一个函数它所做的一切正在通话f。其效果与f功能。因此,我们可以将其重写为:

//some function `f`
const f = x => x + 1;

//different function `g` that just forwards the call to `f`:
const g = f;

console.log(g(41)); //42

and get exactly一样的效果。

在 Lambda 演算中,这种删除本质上为空的“包装函数”的操作被称为埃塔减少 https://en.wikipedia.org/wiki/Lambda_calculus#%CE%B7-reduction.

因此,是的,两者.then(data => console.log(data)) and .then(console.log)做完全相同的事情,您正在执行相同类型的转换,其中您正在取出虚拟转发功能。


然而,这并不是always一个选项。例如,如果删除转发功能最终将调用目标more参数,你可以得到不同的行为。一个臭名昭著的例子是parseInt当用于.map https://stackoverflow.com/questions/262427/why-does-parseint-yield-nan-with-arraymap:

const arrayOfString = ["1", "2", "3"];

const arrayOfIntegers1 = arrayOfString.map(parseInt);
const arrayOfIntegers2 = arrayOfString.map(x => parseInt(x));

console.log("arrayOfIntegers1", arrayOfIntegers1);
console.log("arrayOfIntegers2", arrayOfIntegers2);

问题是Array#map调用回调three参数 - 项目、索引和数组。和parseInt有一个可选的第二个参数 - 如果传入,它会更改数字的解析方式。所以你得到NaN.

观察这一点的最简单方法是console.log:

const arrayOfString = ["1", "2", "3"];

console.log(" --- using just `console.log` as callback ---");
arrayOfString.map(console.log);

console.log(" --- using just `x => console.log(x)` as callback ---");
const arrayOfIntegers2 = arrayOfString.map(x => console.log(x));

因此,只要中间函数具有相同的功能,就可以删除中间函数arity https://en.wikipedia.org/wiki/Arity作为它将被调用的内容以及下一个函数将被调用的内容。

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

对 Promise 中 thenable 回调的工作方式感到困惑吗? 的相关文章

  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 如果对象包含在另一个数组中,则从数组中删除该对象

    我试图从数组中删除一个对象 如果该对象的属性 唯一 包含在另一个数组中 我知道我可以像这样执行嵌套 for 循环 for i 0 i lt array length i for j 0 j lt array2 length j if arr
  • Node js 使用中间件重定向进行过多重定向

    在我的 Node js 应用程序 我使用的是express 4 x 中 我想检查用户是否已登录 如果用户未登录 我想重定向到我的登录页面 然后我在中间件中这样做 服务器 js app use function req res next if
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react

随机推荐

  • 带中继的 TypeScript:无法解析生成的模块

    In my MessageItem tsx组件我有以下代码 const data useFragment graphql fragment MessageItem message on Message date body message a
  • spaCy 共指解析 - 命名实体识别 (NER) 返回唯一实体 ID?

    也许我跳过了部分文档 但我试图确定标准 NER 工具集中每个实体的唯一 ID 例如 import spacy from spacy import displacy import en core web sm nlp en core web
  • 如何使用webcal协议

    我想创建一个文件 可以使用webcal 协议 最终目标是让用户订阅共享日历 我知道这可以通过一百万种不同的方式来完成 而且webcal有缺点 但请将此问题视为技术问题webcal并且不提供替代方案 如果我希望它允许用户订阅共享日历 其内容应
  • 使用“如果单元格包含#N/A”作为公式条件。

    我需要有关 Excel 工作表的帮助 我如何声明以下内容IF状态正常吗 if A1 n a then C1 B1 else if A1 n a or has value int then C1 A1 B1 在中输入以下公式C1 IF ISN
  • 谷歌分析帐户ios配置

    我正在尝试配置谷歌分析GoogleService info plist文件来自谷歌开发者网站 https developers google com mobile add 昨天我配置了一个应用程序 没有出现任何问题 但今天我无法配置我的第二
  • 如何构建混合阵列

    在 ruby 中 我可以创建充满类型的数组 1 hello world Fixnum String Symbol gt 1 hello here Go中如何实现类似的数组填充混合类型 如何声明数组 您可以通过空界面来做到这一点 interf
  • 拖动时自动滚动可放置的 div

    在这个小提琴中 http jsfiddle net adrianjsfiddlenetuser zyUkd 76 http jsfiddle net adrianjsfiddlenetuser zyUkd 76 没有粉红色背景颜色的按钮可以
  • 随机生成器和 CUDA

    我有一个关于 CUDA 中的随机生成器的问题 我使用 Curand 生成随机数 代码如下 device float priceValue int threadid unsigned int seed threadid curandState
  • 条件属性如何工作?

    我有一些标记为的辅助方法 Conditional XXX 目的是在仅存在 XXX 条件编译符号时使方法进行条件编译 我们使用它来调试和跟踪功能 并且效果很好 在我研究条件编译如何工作的过程中 我发现了几个资料来源 说明了标记有Conditi
  • Android 无法绑定到服务(在应用程序计费中)

    我正在尝试在我的应用程序中实现应用程序计费 但我遇到了一些问题 我正在使用 Android 开发人员网站上的示例 每次我启动将连接到计费服务的活动时 它都会向我显示一个无法连接到服务器的对话框 当我按 了解更多 时 它会转到一个正在解释我的
  • 将右侧“完成”按钮 (UIBarButtonItem) 添加到 UINavigationController

    我看到这里有人问了类似的问题 如何向 UINavigationController 添加右键 https stackoverflow com questions 1219779 how to add a right button to a
  • VS Code 找不到 python 3 解释器

    我是第一次安装 Python 3 7 2 并且使用 VS Code python 扩展 当我跑步时python V I get Python 2 7 10这是不正确的 当我选择usr local bin python3VS Code 中的解
  • 一个应用程序中有两个 google-services.json (具有不同的帐户)

    是否可以在 Android 应用程序中使用两个不同的帐户来访问谷歌的两种不同服务 我想通过帐户使用 Google Analytics 分析 电子邮件受保护 cdn cgi l email protection和 Firebase 帐户崩溃报
  • “git checkout <文件名>”和“git checkout -​- <文件名>”之间的区别

    http norbauer com notebooks code notes git revert reset a single file http norbauer com notebooks code notes git revert
  • 主要编译器/工具链对 C99 的支持状况如何?

    对我在这里发表的评论的回应让我停下来思考 我真的不知道 C99 支持的状况如何 维基百科提供了一些编译器的详细信息 但我对 C99 不够熟悉 无法了解该标准的所有细节 因此我正在寻找该问题的格式塔概述答案 主要编译器 工具链对 C99 的支
  • ggplot2 的小提琴图与 x 轴上的数据集的顺序不同

    I created the using below code But on the x axis Models name are not in order as in the data set i e Observed SVM Grid S
  • 如何用CMake安装依赖库?

    我想安装所有依赖库 为了做到我所做的 install FILES path external dll DESTINATION lib 但是 我已经配置了路径 和库 target link libraries target link libr
  • 我正在尝试应用多标签分类

    我正在尝试应用多标签分类 形状是 x train shape 3975 3788 y train shape 3975 66 x test shape 994 3788 y test shape 994 66 当我尝试训练时 出现以下错误
  • 迭代 Pandas 中的行和列

    我正在尝试填充列中所有 NaN 值的平均值 import numpy as np import pandas as pd table pd DataFrame A 1 2 np nan B 3 np nan np nan C 4 5 6 d
  • 对 Promise 中 thenable 回调的工作方式感到困惑吗?

    我是 JS 的新手 正在学习 Promise 我想展示的代码摘录是这样的 promisedFunction then data gt console log data 或者简单地 promisedFunction then console