你能避免与 Promise 完全嵌套吗? [复制]

2024-03-22

据我了解,Promise 的主要卖点之一是能够编写扁平代码(或者,比回调地狱更扁平)。

尽管在很多情况下我们似乎需要嵌套 Promise 才能使用闭包。例如(来自q https://www.npmjs.org/package/q的文档,虽然我使用 Bluebird):

function authenticate() {
    return getUsername()
        .then(function (username) {
            return getUser(username);
        })
        // chained because we will not need the user name in the next event
        .then(function (user) {
            return getPassword()
                // nested because we need both user and password next
                .then(function (password) {
                    if (user.passwordHash !== hash(password)) {
                        throw new Error("Can't authenticate");
                    }
                });
        });
}

有没有一种更干净的方法来做到这一点,而不需要嵌套?

编辑:我已经设法使用清理这个特定的例子.all,但还有更复杂的情况我认为无法做到:

function authenticate() {
    return Promise.all([
        getUsername().then(getUser),
        getPassword()
    ]).spread(function (user, password) {
        if (user.passwordHash !== hash(password)) {
            throw new Error('Can\'t authenticate');
        }
    });
}

是的,你总是可以用以下方法压平承诺链Promise.all(速记通过Promise.join在 Bluebird 中)通过使用 Promise 作为代理。毕竟 - Promise 是抽象值,您始终可以根据需要随时解开 Promise,并让其他变量依赖于它。

它是否更具可读性是另一个争论:

foo().then(function(a){
     return bar(a).then(function(b){
          return g(a,b); // "needed" to nest because I wanted `a`
     });
});

可以写成:

var a = foo();
var b = a.then(bar);
Promise.join(a, b, function(a,b){
    return g(a, b); // alternatively, res could have been `Promise.join(a,b, g)`
});

所以一般来说 - 你can始终避免嵌套,但很多时候您可能不想这样做。

就您而言,这甚至可以是:

function authenticate() {
    var userPass = Promise.all([ getUsername().then(getUser), getPassword()]);
    var passHash = userPass.get(0).get("passwordHash");
    var newHash = userPass.get(1).then(hash);     
    var equal = Promise.join(userHash, newHash, function(a, b){ return a !==b });
    return equal.then(function(val){ if(!val) throw new Error("..."); });
}

奉承?当然。更好的?那是另一个问题了。如果你有一个嵌套的for循环,您可能希望将其保留为嵌套for循环和嵌套,而不是绕过该选项并使用单个循环。

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

你能避免与 Promise 完全嵌套吗? [复制] 的相关文章

  • Chrome 扩展程序:如何根据网址使图标变灰?

    chrome 是否有一个 api 可以禁用 从而灰显 某些 url 上的 chrome 扩展 或者我只需要有一个 if 语句来检查 url 并相应地切换图标 你可以使用chrome declarativeContent https deve
  • React-Native 博览会 POST Blob

    我正在使用 React Native 和 expo 并尝试通过 fetch api 发布 blob 图像 我对正文使用表单数据格式 并且我有下一个代码 const blob await response blob const form ne
  • 现在 JavaScript 的无限循环会导致浏览器崩溃吗?

    我正在学习 JavaScript 对编程很陌生 碰巧遇到了这些无限循环 据说这些循环会永远持续下去并使浏览器崩溃 但是当我用这些代码创建一个循环时 i 0 while i lt 10 document write i 浏览器只是继续加载它
  • (无限?)JavaScript 代码中的循环

    我有以下 JavaScript 代码来在网站上 显示 XML function createChild node tabindex var child node childNodes var r var tabs for i 0 i
  • 从 iframe 中打开 iframe fancybox,以便它在父级中打开

    我可以让它工作 从 iframe 中打开一个 fancybox IMAGE a href Open something a 我遇到的问题是我需要打开一个 fancybox IFRAME 示例代码或任何想法将不胜感激 Thanks 简单来说
  • 页面刷新后如何注销用户?

    我正在跟进谷歌的指南 https developers google com identity sign in web sign in sign out a user注销用户 考虑到gapi auth2刷新页面后将是未定义的 我正在做 if
  • antd上传控件需要action函数,但我不需要它

    我正在使用 ant design 组件 并且有一个上传输入 https ant design components upload https ant design components upload 根据文档 需要对道具进行操作 但是 我不
  • 如何使用canvas获取html5中的视频截图

    您好 是否可以使用 html 5 canvas 捕获正在播放的视频的屏幕截图 看起来这里是可能的 http html5doctor com video canvas magic http html5doctor com video canv
  • Chrome 扩展 |有什么方法可以让 chrome.storage.local.get() 返回一些东西吗?

    在我的 chrome 扩展中 我需要使用 chrome 存储 在我的后台脚本中 我首先创建一个对象并将其添加到 chrome 存储中 然后我想从那里获取我的对象并返回 像这样的东西 var obj chrome storage local
  • 无法导入@material-ui/core/styles/MuiThemeProvider

    我正在开发一个 React 项目 使用 Material UI React 组件 我想进口MuiThemeProvider in src index js像这样import MuiThemeProvider from material ui
  • 在 php 中进行 AES 加密,然后用 Javascript (cryptojs) 解密

    我正在寻找一种对简单文本 5 到 6 个数字和 或字符 进行双向加密的方法 问题是我想在 php 中进行加密 然后通过 Javascript 解密 对于 php 我已经使用 mcrypt encode 进行了测试并使其正常工作 因此当我尝试
  • jquery javascript 在 codeigniter 中不起作用

    大家好 感恩节快乐 我在将此脚本包含在 codeigniter 中时遇到一些问题
  • 通过 JavaScript 获取页面/iframe 的编码

    我想通过 JavaScript 或浏览器中的其他一些 API 以编程方式确定页面的编码 我想要这些信息的原因是因为我试图对主要浏览器支持的字符编码进行模糊测试 显然仅仅因为我发送了适当的 内容类型 并不意味着浏览器会使用编码做正确的事情 欢
  • 计算网站上多个文件的下载次数的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 问题是 计算网站上多个文件的下载次数的最佳方法 我正在尝试做的事情 跟踪并统计多个文件的下载数量 对于具有不同扩展名的文件 foo z
  • 现已弃用使用 Google Places API 获取多种类型

    谷歌最近宣布 自 2016 年 2 月 16 日起 types 参数已被弃用 取而代之的是新的类型参数 每个搜索请求仅支持一种类型 我的问题是 现在有什么方法 不使用已弃用的参数 从单个 API 调用中获取多个地点类型吗 谢谢 None
  • Firefox 扩展中的 localStorage

    我正在尝试从 Firefox 扩展访问页面的 localStorage 我的理解是content给出了参考window当前页面的 当我尝试访问页面的 localStorage 时content localStorage 我想我正在得到它的参
  • 过早退出 Qualtrics 中的循环和合并块

    我目前正在进行一项 Qualtrics 调查 受访者必须解决一长串字谜问题 然后回答一些人口统计问题 为了使变位词部分更容易 我使用了循环和合并块 第一个字段是要解决的变位词 第二个字段是变位词的解决方案 因此调查可以根据受访者的答案来检查
  • 如何在 vue.js 中使用 SVG.js 插件?

    我在用svg js在我的 Laravel 项目中运行vue js 这就是我使用的方式svg js Step 1 安装svg js作为我的 vue 应用程序中的插件 import svgJs from svg js dist svg expo
  • 用圆形雷达数学方法表示点

    我正在编写一个简单的应用程序 它可以向您显示您周围的朋友 但不是在法线地图中 而是在像 UI 这样的真正圆形雷达上 https i stack imgur com Au3IP png https i stack imgur com Au3I
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文

随机推荐

  • Array.prototype.includes函数如何比较对象

    在 ECMA 规范中 我们读到Array prototype includes https tc39 es ecma262 sec array prototype includes uses 相同值零 https tc39 es ecma2
  • 为什么错误:元素类型无效:需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:数字

    我正在运行这个程序来显示 SVG 图像 import React Component from react import View from react native import Expo from assets check mark s
  • 不幸的是应用程序已停止 - android.os.NetworkOnMainThreadException [重复]

    这个问题在这里已经有答案了 我正在编写一个应用程序 其中允许用户输入其详细信息 但每当用户单击 提交 按钮时 我都会收到错误消息 错误消息如下 不幸的是应用程序已停止 android os NetworkOnMainThreadExcept
  • 通过键盘触发 JQuery 模态框的 Ctrl+P 打印

    我有一个在 JQuery 模态框中弹出的文档 该文档末尾有一个打印按钮 只需打印弹出框中的文档 我正在寻找一种解决方案 可以通过按 Ctrl P 打印弹出框 现在 Ctrl p 打印所有页面 包括背景 我只是希望找到一个解决方案 帮助我仅在
  • 如何使用 MSTest 从命令行运行 SpecFlow 场景?

    我有 Visual Studio 2010 并且我们有两个使用的 VS 解决方案 第一个是 Web 应用程序 第二个是严格用于 SpecFlow 测试 同时运行两个 Visual Studio 实例来运行 SpecFlow 功能会占用所有可
  • 从另一个网站获取数据

    我正在使用 PHP 创建一个新网站 我想从另一个有我的个人资料的网站获取数据 其中包含壁纸 徽标等 我想从该网站获取数据并将其显示在我的新网站的内容部分中 请给我一些关于如何在 PHP 中完成此任务的想法 提前致谢 参见例如这卷曲延伸 ht
  • Clojure 中的惯用模式函数

    我正在学习 Clojure 想要一些关于惯用用法的建议 作为小型统计包的一部分 我有一个计算一组数据的众数的函数 背景 众数是一组数据中最常见的值 几乎有十几种已发布的算法来计算它 这里使用的算法来自 Bernard Rosner 的 生物
  • 鼠标移动时滚动窗口

    大家好我的意思是 当鼠标移向窗口边缘 x 或 y 或两者 时 我希望页面滚动 当鼠标停止移动时 我希望页面停止滚动 有很多关于如何基于使用 onClick 事件或窗口边缘的滚动区域进行滚动的示例 但基于鼠标光标的移动的示例并不多 任何帮助将
  • 解析多部分表单数据

    我正在尝试组合一个 HTML POST 表单 该表单具有两个字段 文件上传和文本字段 由于表单具有用于文件上传的 multipart form data 类型 因此我无法通过正常的 PHP POST 变量获取文本字段 那么如何使用 PHP
  • ASP.NET 中的静态对象浪费内存?

    前几天我只是想知道这个问题 我不太确定 ASPX 如何管理垃圾处理 但据我所知 完成加载 不会删除静态内存值或在页面重新加载后 至少就 C 而言 静态意味着内存分配会跟随您的程序 直到程序本身关闭 ASPX 中也是这样吗 如果我有一个静态值
  • 我们可以在 C# 项目中使用 COM 对象吗?

    我按照教程制作了一个 C COM 对象 http www codeproject com Articles 18939 C Com http www codeproject com Articles 18939 C Com 现在我想在 C
  • VB.NET 中的 UploadString(Post 方法)不起作用

    我正在尝试将简单数据发布到某个站点 在本例中发布到本地服务器上的 php 文件 我的 VB NET 代码 Dim W As New Net WebClient Dim A As String W Encoding System Text E
  • Google 如何确定将页面索引为讨论页面? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在自己建立一个问答网站 我想让这个网站被Google索引为问答网站或论坛 可以在使用Google中的 讨论 时检索到 根据我的个人经验 当我想获得
  • pymongo:使用 MongoReplicaSetClient 的优点?

    看来两者Mongo客户端 http api mongodb org python current api pymongo mongo client html and MongoReplicaSet客户端 http api mongodb o
  • IOS:停止 NSTimer [重复]

    这个问题在这里已经有答案了 可能的重复 NSTimer 不会停止 https stackoverflow com questions 1031554 nstimer doesnt stop 我有这个代码 NSTimer scheduledT
  • TensorFlow中矩阵乘法函数的使用

    我对这个函数的使用有点困惑tf matmul 在 TensorFlow 中 不过 我的问题可能更多是关于深度学习的理论 假设你有一个输入 X 和权重矩阵 W 假设零偏差 我想将 WX 计算为输出 可以通过以下方式完成tf matmul W
  • 找不到适用于 jdbc:mysql/localhost:3306/world 的驱动程序

    我是这个领域编程的新手 我在驱动程序方面遇到了一些问题 有点 当我直接与客户端一起使用时 MySql 工作正常 问题是我无法将 tomcat 与 MySql 连接 我将所有驱动程序放在 WEB INF lib 中 使用mysql 5 7 t
  • Word 文档的 XML/XSD 验证

    我有一份将不断更新的文档 由文本和表格组成 这些表有两行 第一行包含数字范围 第二行包含单个数字 我想检查第 2 行中的数字是否在第 1 行给出的范围内 我想使用 XML 和 XSD 来执行此操作 我最初的想法是从单词 doc 创建一个 X
  • python-docx 从下拉列表中获取信息(在表中)

    我有一个包含多个表的 docx 文件 我想从列表中的表中获取所有信息 该列表称为 alletabellen 通过下面的脚本 我收到了表格中几乎所有的信息 除了下拉列表中的某些变量的值 在某些表格单元格中 这些单元格的值在我的列表中保持为空
  • 你能避免与 Promise 完全嵌套吗? [复制]

    这个问题在这里已经有答案了 据我了解 Promise 的主要卖点之一是能够编写扁平代码 或者 比回调地狱更扁平 尽管在很多情况下我们似乎需要嵌套 Promise 才能使用闭包 例如 来自q https www npmjs org packa