如何从这个承诺层蛋糕中返回布尔值?

2024-03-21

我有一个控制器方法,它接受一个字符串参数,这样我就可以测试用户是否有能力。用户拥有许多角色,并且角色附加了一系列权限,我们需要检查它是否包含该功能。我知道这过于冗长,但为了理解,我就这样保留了。稍后会重构...

App.WorkspaceIndexController = Ember.Controller.extend({
    userCan: function(capability) {
      var userHasCapability = false;
      var userPromise = this.get('session.user');

      var rolesPromise = userPromise.then( function(user) {
        return user.get('roles');
      });

      var filteredRolesPromise = rolesPromise.then(function (roles) {
        return roles.filter(function (role) {
          return role.get('workspace') === self.get('workspace');
        });
      });

      filteredRolesPromise.then(function (filteredRoles) {
        return filteredRoles.forEach(function (role) {
          userHasCapability = _.contains(_.flatten(role.get('permissions'), 'name'), capability);
        });
      });

      return userHasCapability;

    },
    ...
});

我遇到的问题是,如果用户有权限,我需要返回布尔值的方法。每次都会返回 false。我是否不正确地设置了 userHasCapability 属性,或者我应该执行其他操作来返回该值?


原始类型(例如 bool、int、string 等)是复制的,而不是引用的。这意味着你回来了userHasCapability,并且立即返回值 false,设置userHasCapability在该承诺的范围内,并不意味着它会被退回。事实上它不会。

此外,真正的响应需要采用承诺的形式,无论谁调用它,都需要以这种形式使用它。

这是操作顺序,假设foo calls userCan.

App.WorkspaceIndexController = Ember.Controller.extend({
    foo: function(){
      var j = this.userCan('eat worms');  // 1. method is called, 6. j is set to false, we fall out of foo
    },
    userCan: function(capability) {
      var userHasCapability = false;
      var userPromise = this.get('session.user');

      var rolesPromise = userPromise.then( function(user) { // 2. promise built
        return user.get('roles'); // 7. this promise happens is resolved
      });

      var filteredRolesPromise = rolesPromise.then(function (roles) { // 3. another promise built
        return roles.filter(function (role) { //8 return the filter cause 7 resolved
          return role.get('workspace') === self.get('workspace');
        });
      });

      filteredRolesPromise.then(function (filteredRoles) { // 4. another promise built
        return filteredRoles.forEach(function (role) {  //9. 8 resolved so do this now, even though no one references userHasCapability anymore
          userHasCapability = _.contains(_.flatten(role.get('permissions'), 'name'),  capability);
        });
      });

      return userHasCapability; // 5. false is returned

    },
    ...
});

事实上,角色是一个承诺,这意味着任何尝试使用它的人都需要期待一个承诺的结果(或者不要使用异步,也不要使用承诺)

App.WorkspaceIndexController = Ember.Controller.extend({
    foo: function(){
      this.userCan('eat worms').then(function(result){
        console.log(result);
      });
    },
    userCan: function(capability) {
      var userHasCapability = false;
      var userPromise = this.get('session.user');

      var rolesPromise = userPromise.then( function(user) { // 2. promise built
        return user.get('roles'); // 7. this promise happens is resolved
      });

      var filteredRolesPromise = rolesPromise.then(function (roles) { // 3. another promise built
        return roles.filter(function (role) { //8 return the filter cause 7 resolved
          return role.get('workspace') === self.get('workspace');
        });
      });

      return filteredRolesPromise.then(function (filteredRoles) { // 4. another promise built
        filteredRoles.forEach(function (role) {  //9. 8 resolved so do this now, even though no one references userHasCapability anymore
          userHasCapability = _.contains(_.flatten(role.get('permissions'), 'name'),  capability);
        });
        return userHasCapability;
      });
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从这个承诺层蛋糕中返回布尔值? 的相关文章

  • 删除 Ember 数据中 POST/PUT 操作的 JSON 根元素

    我正在使用一个 Web 服务 该服务在 POST PUT 动词中需要如下所示的 JSON id CACTU companyName Cactus Comidas para llevar contactName Patricio Simpso
  • emberjs 和 Foundation4

    我正在尝试使用 emberjs 和 Foundation 4 现在使用 zepto 框架 但一旦我将 emberjs 添加到我的 application js 中 基础代码就停止工作 包含的顺序有问题吗 require jquery req
  • 集成 bootstrap-select 以与 Ember 配合使用

    我想得到引导选择 https github com silviomoreto bootstrap select使用 Ember js Ember 对视图对象的管理存在一些问题 导致其无法按预期工作 JSFiddle http jsfiddl
  • 为什么 Ember 路由器只允许导航到叶路由?

    我最近注意到 Ember Router 只允许导航到叶路由 没有子路由的路由 现在 除非我做的事情不正确 否则这看起来像是设计中的错误 错误 让我们举个例子 我有一个项目集合 每个项目都有许多合作者 因此我想构建一个具有 3 列布局的 UI
  • 将带有参数的视图组件渲染到名为outlet ember.js 中

    我的应用程序模板中有 2 个命名网点 slider area and pre footer 有没有一种方法可以传递带有参数的视图组件 如main slider索引模板中显示的组件是否连接到命名出口 所以我需要通过 main slider s
  • 在 Ember.js 中,存储保存和存储提交之间有什么区别?

    有什么区别 this get store commit and this get store save 没有区别 save是一个别名commit与此一起介绍的PR 使 commit 成为 save 的别名 https github com
  • arrayWillChange 中“无法调用未定义的‘销毁’方法”

    我有一个非常标准的数组 模板关系设置 但是当我将一个新项目推入数组时 我得到了上面提到的内容Cannot call method destroy of undefined错误在arrayWillChangeEmber源码的方法 for id
  • ember 中可重用对象的架构

    我正在使用 ember 构建一个管理仪表板 我想创建一个可重用的图表对象 我可以在整个应用程序中拥有多个实例 图表对象应该有一个由一些标记和一个画布元素组成的模板 在插入 DOM 后我需要其 id 以便附加实际的图表 chart js 我尝
  • 标签中的 Ember 车把模板

    ember 特别是应用程序模板 是否可以在 head 标签内进行操作 以便动态更改标题标签 元标签 外部 css 样式表和 favicon 等内容 如果是这样 那么一种干净的方法是什么 为了完成这项工作 我所做的是创建车把助手 例如 如果您
  • Ember 中可靠的视图

    我有一个列出专辑的应用程序 当同时点击专辑时AlbumView and App overlay 也是一个视图 被显示 App overlay Ember View create 类似灯箱的叠加 and App AlbumView Ember
  • 在 ember 数据中,在 forEach 循环中调用 destroyRecord 会破坏循环吗?

    我正在为我的一个项目开发一个简单的标签模型 我已经在 Angular 中实现了类似的东西 但我想在 Ember 中尝试一下 型号代码如下 Tag DS Model extend name DS attr string user DS bel
  • Ember:断言失败:EmberObject.create 不再支持定义计算属性

    我使用的是 Ember 2 16 版本 我们升级到了 3 8 版本升级后 我看到此错误 但无法弄清楚错误来自何处 在什么情况下我会收到此错误 我看到其中一篇帖子 Ember JS 中的动态计算属性已弃用 https stackoverflo
  • Ember Data 未找到模型,但它显然存在

    我和其他许多人一样将我的 ember 应用程序升级到了最新版本 但升级后 我的应用程序仍然无法工作 我已经简化了很多 这归结为我的路线 我的路线是这样的 按照过渡指南中的建议 App BoxesRoute Ember Route exten
  • 观察嵌套对象的属性

    小提琴示例 http emberjs jsbin com aviyUnA 9 edit html js 输出 http emberjs jsbin com aviyUnA 9 edit html js output 这是我的模型 name
  • Ember 未在生产环境中加载某些图像

    我有一个 Ember cli 1 13 应用程序 它在公共目录中存储了很多图像 现在 它将正确加载除特定组件中的图像之外的所有图像 该组件的调用方式如下 list item url list url name List Name price
  • 在 Codeigniter 中使用/嵌入 Ember js

    我即将开始开发一个 Web 应用程序 使用 Ember js 作为前端技术 使用 Codeigniter 作为后端 我遇到的问题是如何在 codeigniter 中嵌入或使用 ember js 可以通过 Web 服务从 codeignite
  • 在 EmberJS 中获取父路由

    我正在制作一个可重用 有点多态 的评论小部件 我想要一个按钮 使我能够返回到父路由 例如 如果我位于 blog posts 1 comments 我希望该按钮将我带回 blog posts 1 我目前正在使用transitionToRout
  • 找不到将 ember-cli 应用程序迁移到 TypeScript 的模块

    我想在我的 ember 项目中尝试 ts 我之前在小型应用程序上尝试过 所以我有 ember cli typify 0 3 1 typescript 2 0 3 typings 1 4 0 ember cli 2 4 3 在我的里面tsco
  • Ember:命名出口错误

    我不知道为什么我的模板没有在指定的插座中呈现 这是我第一次尝试学习 ember 我被困在指定的渠道上 我想渲染侧边栏模板 in the outlet sidebar 和内容模板 in the outlet content 但我不断在控制台中
  • 在 #each 内渲染视图

    每当我尝试在 each 块内渲染视图时 我都会收到一条 PrecompilationError 消息 Compiler said Error each doesn t match view Example each posts view A

随机推荐

  • 帮助在 Rails 中构建模型

    class Profile has many projects through gt teamss has many teams foreign key gt member id has many own projects class na
  • Jenkins:动态作业创建引发“管道 CPS 方法不匹配”错误

    我正在尝试从应并行运行的管道作业之一创建多个动态作业 我希望我的詹金斯管道脚本根据用户输入下载并安装我的软件二进制文件 以下是我的示例阶段 第 1 阶段 将下载构建版本 第 2 阶段 获取参数并安装软件的 云 部分 第 3 阶段 将接受用户
  • Mongoose populate() 返回空数组

    所以我已经花了大约4个小时 阅读了几次文档 但仍然无法找出我的问题 我正在尝试对我的模型执行一个简单的 populate 我有一个用户模型和商店模型 用户有一个 favoriteStores 数组 其中包含商店的 id 我正在寻找的是这个数
  • SQL查询where参数为null不为null

    我正在尝试执行 SQL 查询并根据参数是否为空或否动态构建 where 条件 我有这样的事情 SELECT tblOrder ProdOrder tblOrder Customer FROM tblOrder CASE WHEN Order
  • 找不到模块“内部/错误”离子

    我正在尝试创建新的离子项目 然后它显示以下错误 我已经删除了nodejs npm ionic并再次重新安装 但再次出现相同的错误 Terminal https i stack imgur com vLP7J png Error Error
  • 使用 Ajax 加载用户控件

    我试图找到使用 Ajax 加载用户控件的最佳实践 我的第一种方法是简单地使用 UpdatePanel 并在 ajax 回发上使用 LoadControl 弹出它 但这会在同一 UpdatePanel 中重新呈现其他加载的用户控件 另外 我无
  • cassandra 节点限制

    我正在寻找 cassandra 是否有节点硬件规格的限制 例如如果存在任何此类限制 每个节点的最大存储可能是多少 我打算使用几个节点 每个节点具有 48TB 存储 2TB X 24 硬盘驱动器 7200rpm 并配有一些良好的双 Xeon
  • SMTP 验证错误“发送邮件失败”

    如果满足某些条件 我将尝试从我的 ASP NET 网页发送电子邮件 这是我的代码 SmtpClient smtpClient new SmtpClient NetworkCredential basicCredential new Netw
  • 如何找到 Homebrew 的可安装软件包列表?

    最近我安装了Brew https brew sh 如何检索要安装的可用brew 软件包的列表 brew help将显示可用命令的列表 brew list将显示已安装软件包的列表 您还可以附加公式 例如brew list postgres会告
  • 当请求为 POST 时,在 Apigee HTTPTargetConnection 上调用 GET

    我需要调用使用 GET 的旧版 API 我的 API 代理使用 POST 我尝试使用AssignMessage
  • 将一个字符串更改为另一个字符串的简单突变数量?

    我相信你们都听说过 文字游戏 在这种游戏中 您试图通过一次更改一个字母来将一个单词更改为另一个单词 并且只浏览有效的英语单词 我正在尝试实现一个 A 算法来解决它 只是为了充实我对 A 的理解 并且需要的东西之一是最小距离启发式 也就是说
  • Angular 单元测试 Jasmine Spy 错误

    以下控制器收到类型错误 未定义 不是函数 正在评估sessionService getCurrentPlace 我有一个模拟服务 该方法正在被监视 模拟服务上的另一种方法工作正常 我试过了 AndReturns 关于间谍以及 AndCall
  • 在 MATLAB 中为结构体数组的字段赋值

    我想替换结构体数组中字段的值 例如 我想在以下结构中将所有 1 替换为 3 a 1 b 1 a 2 b 2 a 3 b 1 a a b 1 b 3 This doesn t work and spits out Insufficient o
  • 是否有一个“空”printf 代码不打印任何内容,用于跳过参数?

    如果我想要一个程序有多种文本输出格式 我可以这样做 const char fmtDefault u x s 2f each n const char fmtMultiLine Qty 3u nItem s nPrice per item 2
  • Kartik Select2 - 以编程方式更改多个

    我有一个 yii2 activeform 其中表单的功能可以根据表单中的其他内容进行更改 所以 我有一个俱乐部字段 在某些情况下可以是多个 但在其他情况下不能是多个
  • 零/符号扩展是无操作的,为什么要为每种大小类型提供指令呢?

    对于 x86 和 x64 编译器生成类似的零 符号扩展 MOVSX 和 MOVZX 扩展本身并不是免费的 但允许处理器执行无序魔法加速 但在 RISC V 上 因此 无符号和有符号 32 位整数之间的转换是无操作 从有符号 32 位整数到有
  • Keras 在激活函数之前检索节点的值

    想象一个完全连接的神经网络 其最后两层具有以下结构 Dense units 612 activation softplus Dense units 1 activation sigmoid 网络的输出值为 1 但我想知道 sigmoidal
  • Android 2.1 的操作栏

    是否有适用于 Android Level 7 的操作栏或其他我可以用作操作栏的东西 我需要构建一个使用 Android 2 1 操作栏的应用程序 JohanNilsson 实际上创建了一个ActionBar图书馆可在GitHub 直接链接
  • 将 Twitter Bootstrap 与 Wordpress 一起使用

    如何将 Wordpress 与 Twitter Bootstrap 一起使用 我知道如何设置 Wordpress 页面 并且已经使用过 Bootstrap 但现在我想第一次一起使用这两个 对于我的 WordPress 项目 我通常只安装 W
  • 如何从这个承诺层蛋糕中返回布尔值?

    我有一个控制器方法 它接受一个字符串参数 这样我就可以测试用户是否有能力 用户拥有许多角色 并且角色附加了一系列权限 我们需要检查它是否包含该功能 我知道这过于冗长 但为了理解 我就这样保留了 稍后会重构 App WorkspaceInde