使用 Promise 的多路流的正确模式

2024-06-09

所以我在过去的几天里一直在玩承诺,只是试图转换一些项目,使用承诺,但我不止一次遇到这个问题。

在阅读文章和教程时,一切看起来都很顺利和干净:

getDataFromDB()
.then(makeCalculatons)
.then(getDataFromDB)
.then(serveToClient)

但实际上,事实并非如此。
程序有很多改变整个流程的“if 条件”:

getDataFromCache(data).then(function(result){
    if(result){
        return result;
    }else{
        return getDataFromDB();
    }
}).then(function(result){
    if(result){
        serveToClient() //this does not return a promise, so undefined returned...
    }else{
        return getDataFromWebService(); //this does return a promise, 
    }
}).then(function(result){
    //i dont want to reach here if i already serveToClient()...
    //so i basically have to check "if(result)" for all next thens
    if(result){
       //do more stuff
    }
}).then(...

我有两个主要问题:

  1. 我发现自己添加了很多if的条件then回调。
  2. 我还在进入下一个then回调,即使我已经完成了(serveToClient)


我遵循正确的模式吗?


你无法避免if语句,因为这是您的逻辑流程所必需的。你不得不branch如果您不想在某一部分继续承诺链,则您的控制流if。所以如果在你第二个的某个时候.then()处理程序,你不想继续第三个.then()处理程序,那么您需要像这样分支逻辑并放置后续的.then()2号内的处理程序.then()处理程序在自己的逻辑分支中。

你不能只继续顶级分支,因为这是中止未来的唯一方法.then()主链中的逻辑是拒绝承诺(您可能不想这样做)或添加另一个承诺if检查每个.then()处理程序来决定是否应该跳过它(恶心)。

因此,您可以像这样分支逻辑:

getDataFromCache().then(function(result){
    if(!result) {
        return getDataFromDB()
    } else {
        return result;
    }
}).then(function(result){
    // branch promise chain here into two separate branches
    if(result){
        // do not continue the promise chain here
        // call a synchronous operation
        serveToClient();
    } else {
        // continue promise chain here
        return getDataFromWebService().then(function(result) {
            if(result){
               //do more stuff
            }
        }).then(...);    // you can continue the promise chain here
    }
}).catch(function(err) {
    // process any errors here
});

您可能会发现这些其他答案很有用:

理解 javascript 的承诺;堆栈和链接 https://stackoverflow.com/questions/29853578/understanding-javascript-promises-stacks-and-chaining/29854205#29854205

Promise.then.then 和 Promise.then; 之间有区别吗?承诺.然后 https://stackoverflow.com/questions/32216619/is-there-a-difference-between-promise-then-then-vs-promise-then-promise-then/32216660#32216660


仅供参考,您可以将上面的代码重新组织得更简洁,如下所示:

getDataFromCache().then(function(result) {
    if (result)
        serveToClient();
    } else {
        return getDataFromWebService().then(function(result) {
            if(result){
               //do more stuff
            }
        }).then(...);    // you can continue the promise chain here
    }
}).catch(function(err) {
    // process any errors here
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Promise 的多路流的正确模式 的相关文章

  • 我可以在一个变量中拥有多个值吗?

    正如标题 我可以在一个变量中拥有多个值吗 首先 我有这个表格
  • 如何为 D3 条形图分配随机颜色?

    我正在根据下面的模型制作 D3 条形图 如何使条形具有随机颜色 jsFiddle http jsfiddle net rdesai MjFgK Code svg append g attr class x axis attr transfo
  • AS3/JavaScript if 语句用逗号代替 & &

    它在 ActionScript 3 和 JavaScript 中运行 为什么 我知道该怎样 and 工作 但是一个清单 这是 AS3 特定的吗 这是其他语言的吗 我是一个用嘴呼吸的 PHP AS2 程序员 还是每个人都已经知道这一点而我是一
  • 如何使用 Office.js 获取单元格的格式

    我正在开发一个 Excel 加载项 它提取单元格 A1 的文本 包括其格式 并在其自己的区域中显示文本 所以添加包含这个 见下面的截图 显示格式化文本的区域 开始提取的按钮请点击查看图片 https i stack imgur com oy
  • 有适用于 .NET/C# 的 Javascript 引擎吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将数据从 javascript/html 页面发送到 Express NodeJS 服务器

    我正在使用 html5 和 javascript 开发 cordova 应用程序 该架构如下 电话应用程序向服务器请求某些内容 服务器请求 firebird 数据库 数据库回答服务器 服务器将所请求的数据提供给电话应用程序 在 html5
  • Javascript 充满好奇心

    当我调用这个 Promise 时 输出与函数调用的顺序不匹配 这 then出现在 catch 即使承诺 then之后被呼叫 这是什么原因呢 const verifier a b gt new Promise resolve reject g
  • 量角器:向下滚动

    我的页面上有一个按钮 当用户向下滚动时可见 因此 量角器测试给了我一个错误 UnknownError 未知错误 元素在点 94 188 处不可单击 我尝试使用 browser executeScript window scrollTo 0
  • JQuery:如何自动完成“城市,州”?

    Question 怎么用啊JQuery 自动完成插件 http docs jquery com Plugins Autocomplete建议地点 City State 用于输入字段 意思是 有人想输入 伊利诺伊州芝加哥 所以他们开始打字 C
  • 解构为两个单独的变量

    有没有一种快速的方法来解构一个对象 以便将其存储到两个不同的组中 例如 const obj a 1 b 2 c 3 d 4 e 5 const a b obj store the rest of the properties that we
  • Apache 服务器上的服务器端 Javascript

    我们打算使用Apache https httpd apache org 用于 Web 开发的服务器 对于服务器端脚本 我们希望使用服务器端 javascript 要使服务器端 javascript 在 Apache 服务器上工作需要什么 S
  • 有没有一种方法可以使页面布局在 100% 缩放下完美契合,同时又尊重更大的缩放系数?

    有多种方法可以布局网页 使其适合浏览器视口 DOMwindow 当我说 适合 时 我包括更改所用字体的大小 更改 DIV IMG 和其他渲染元素的宽度和高度 以及允许元素 流畅 移动 目标是使页面在所有显示设备 从小型手机到大桌面屏幕 上看
  • Javascript 清理:插入可能的 XSS html 字符串的最安全方法

    目前我正在将此方法与 jQuery 解决方案结合使用 以清除字符串中可能的 XSS 攻击 sanitize function str return htmlentities str ENT QUOTES return div div tex
  • 如何使用 JavaScript 禁用滚动条?

    当我仅在 Internet Explorer 7 中显示代表模式窗口的 div 时 我需要锁定浏览器滚动条 谷歌搜索我发现我可以使用document body style overflow hidden 但这不适用于 IE7 我也尝试过do
  • 解析 PHP 响应:未捕获的语法错误:意外的标记 <

    我正在使用 AJAX 来调用 PHP 脚本 我唯一需要从响应中解析的是脚本生成的随机 ID 问题是 PHP 脚本会引发许多错误 这些错误实际上很好 不会妨碍程序功能 唯一的问题是当我跑步时 parseJSON response I get
  • 在 WordPress 和 woocommerce 中禁用 zxcvbn.min.js

    如您所知 zxcvbn min js 约为 400kb 并且默认在 WordPress 网站中加载 我想知道如何阻止加载此 JavaScript 库 因为我不想在我的网站中检查密码长度 将以下内容添加到主题的 function php 或自
  • 如何使网站适应用户的屏幕分辨率?

    我正在使用 1024x768 屏幕分辨率来设计我的网站 当您从屏幕分辨率较小 较大的计算机上的浏览器中查看网站时 网站开始变形 无论用户的屏幕分辨率是什么 如何使网站适应用户的屏幕分辨率 我相信通过 JavaScript 或 CSS 是可能
  • 为什么 "asdf".replace(/.*/g, "x") == "xx" ?

    我偶然发现了一个令人惊讶的 对我来说 事实 console log asdf replace g x Why two替代品 似乎任何没有换行符的非空字符串都会产生此模式的两个替换 使用替换函数 我可以看到第一个替换是整个字符串 第二个替换是
  • 变量值的 swap() 函数[重复]

    这个问题在这里已经有答案了 我无法达到下面这个交换函数的预期结果 我希望将值打印为 3 2 function swap x y var t x x y y t console log swap 2 3 任何线索将不胜感激 您的函数正在内部交
  • 每次页面重新加载时都会出现新的 Google 登录库提示

    在我的项目中 我使用常规弹出客户端 JS 身份验证 平台客户端 https developers google com identity sign in web sign in 我从旧版 Google Sign 迁移到新版 Google I

随机推荐

  • 如何使用嵌入式jetty服务器部署war

    我有一个带有嵌入式码头服务器的战争文件 我想把它部署到网上 我应该先做什么 我尝试在 IDE 中运行它 效果很好 但我对如何在线部署它感到困惑 我不想每次尝试像 IDE 那样运行我的应用程序时都启动服务器 例如 我想输入 http 119
  • iOS - 条件编译(xcode)

    我为最初的 iPhone 应用程序创建了一个额外的 iPad 目标 来自苹果文档 几乎在所有情况下 您都需要定义一个新的视图控制器类来管理应用程序界面的 iPad 版本 特别是当该界面与您的 iPhone 界面完全不同时 您可以使用条件编译
  • 如何访问 tf.layers.conv2d 中的内核变量?

    我想可视化卷积层中的权重以观察它们如何变化 但我找不到一种方法来访问卷积层中的权重tf layers conv2d 谢谢 您可以通过名称访问该变量 weights sess run
  • 隐藏 SSRS 嵌套组同时显示详细信息行

    我有一个分层数据集 如下所示 Group1 Group2 Group3 Group4 Group5 Detail Food Fruit Red Apple Apple Food Fruit Orange Orange Orange Food
  • AWS应用程序负载均衡器和socket.io

    我有一个正在运行的 socket io 聊天室 当我们在一台机器上运行时 其流量越来越大 我们已经使用 ws 套接字库运行了基准测试 它们的性能确实要好得多 这将更好地利用我们的硬件 但这会以必须重写我们的应用程序为代价 我们的 socke
  • 如何在 OSX 上的应用程序名称下创建子项菜单?

    如何在下面添加TMenuItemProject1以上Quit在下面的屏幕截图上 我创建了一个 TMenuBar 并选中了 UseOSMenu 属性 我添加的第一个 TMenuItem 是主栏中的第二个 TMenuItem 您可以通过将 II
  • Android:从 onRestoreInstanceState() 调用时 AsyncTask 失败

    我有一个应用程序 它的 UI 需要一些工作来构建 必须处理一些东西 因此 我使用 AsynchTask 构建 UI 它在执行一些后台处理时显示进度对话框 然后更新 UI 我希望能够从 OnRestoreInstanceState 调用此 A
  • clone() 对象是什么意思?

    vb6 或 java 中的对象克隆是什么 我们在什么情况下使用克隆 克隆对象是什么意思 任何人都可以用例子告诉我吗 克隆实际上是将对象数据复制到新的对象中 此示例不克隆数据 Foo p new Foo Foo o p If Foo有一个会员
  • (一张表)插入行

    这个问题是继续this one https stackoverflow com questions 56246041 one table get rows not in without union 我有下表egr offid groupid
  • 调整移动加速计数据以考虑手机旋转

    我希望记录移动加速度计数据 x y z 并将其调整为一致 无论手机的方向 旋转如何 这里的用例是在驾驶时记录和标准化这些参数 以检测转弯 扭曲等 其中的一个关键要素是确保报告的数据独立于手机在汽车中的方向 我在用gyronorm js ht
  • 如何在Delphi XE中通过名称获取类类型引用?

    我实际上正在尝试使用 Rtti 来实现通用方法调用程序 它应该像这样工作 我将提供类名 方法名和参数 调用者将通过调用此类的指定方法来完成其工作 因此 我需要类引用才能获取其 Rtti 信息并寻找我想要调用的方法 有没有办法在不实现我想要使
  • Android onClick 幻灯片过渡到下一个 Activity

    文本视图当前充当进入我的应用程序上的注册页面的按钮 我目前正在尝试弄清楚当用户单击文本视图并转到注册活动时如何应用幻灯片过渡 我在使用 android 提供的转换库方面并没有丰富的经验 我提到了这个https github com lgva
  • 如何从 JSON 获取字符串对象而不是 Unicode

    我在用着Python 2从中解析 JSONASCII 编码文本文件 当使用以下任一方式加载这些文件时json https docs python org 2 library json html or simplejson https pyp
  • 重复表顶部的行组作为 SSRS 中每个组之间的表标题

    我有一张表格 显示世界上所有国家 地区所有城市的人口和其他详细信息 我已成功在 SSRS 中创建此表 其中 国家 地区 列作为行组 现在 我不想让国家 地区名称占据第一列 而是希望将此信息作为表格标题 标题向上移动 以便有更多空间在表格右侧
  • Laravel 5.3 中 ajax POST 的最小工作示例

    有人可以用完整的最小示例解释 Laravel 5 3 中的 ajax post 方法吗 我知道网络上有一些资源 但我错过了一个简洁 直接的最小示例 我认为您对模型 控制器 视图范例有基本的了解 对 Laravel 有基本的了解 并对 Jav
  • 单击时如何来回交换文本?

    我需要的是来回交换文本 一个间隙 到Word单击它 我不想有按钮 用户只需单击间隙的位置即可 I see 这一页 https css tricks com swapping out text five different ways 准确地描
  • 如何获取 YouTube 频道名称?

    我已经搜索过YouTube 文档 https developers google com youtube v3 并没有找到任何可以从 YouTube 视频中获取其他频道名称的方法 That is 我目前想从以下位置获取频道名称video h
  • wp_mail(Wordpress 邮件功能)未发送到 gmail 或 live.co.uk 帐户

    我有一个网站 允许访问者通过两种方式联系我 通过其自己页面上的联系表单和侧边栏中的 ajax 小型联系表单 两种联系方式都会向我的 Gmail 帐户发送电子邮件 它自己页面上的联系表单工作正常 但ajax表单不会发送到gmail 也不会发送
  • iOS 非矩形图像裁剪? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Promise 的多路流的正确模式

    所以我在过去的几天里一直在玩承诺 只是试图转换一些项目 使用承诺 但我不止一次遇到这个问题 在阅读文章和教程时 一切看起来都很顺利和干净 getDataFromDB then makeCalculatons then getDataFrom