- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是伪场景
| then (items) | then (items, actions)
getItems() | getActions(for:items) | apply(actions -> items)
:promise | :promise | model <= items
| | :synchronous
换言之:
这是我正在使用的代码
return itemsResource
.getItems(userId)
.$promise
.then(function(items) {
return actionsResource
.getActions(items.map(i => i.id)) // pseudo mapper code here
.$promise
.then(function(actions) { // THIS IS NESTED so it sees both promise results
return [items, actions];
});
})
.then(helper.spread(function(items, actions) {
applyActions(items, actions);
$scope.model.items = items;
return items;
}));
如您所知,我最初不能使用 $q.all
,因为第二个(操作) promise 取决于第一个(项目)的结果。
为什么不返回带有项目的操作?因为我正在为所有用户缓存项目,所以项目获取非常快。这类似于 Stackoverflow 的工作方式。他们只是返回问题,而不考虑用户的请求。然后他们随后还请求首选和忽略的标签,并应用于获取的问题。这可以很好地扩展,否则 SO 将需要更多的服务器来处理所有用户的初始问题列表,因为每个用户的请求都会产生不同的结果,因此缓存没有多大意义。
为什么不在获取后立即将项目应用到 $scope
?这会消除额外的嵌套 then
,没错。但我没有这样做,因为之后还有几个步骤,并且每次其中一个 promise 得到解决时,至少会执行一个 $digest
循环。对于许多项目(相当复杂的对象),这可以解释相当多的处理。这就是我坚持将项目传递到 View 的原因,直到可能的最后一刻。
除了这两个变通办法之外,有没有办法避免嵌套的then
:
$scope
如果可能的话,我想在不引入额外资源的情况下尽可能地扁平化我的代码吗?
最佳答案
除非我遗漏了什么,否则这应该相当简单,不是吗?
(为了清楚起见,我简化了一些内部函数签名)
itemsResource.getItems(userId)
.then(function(items) {
return $q.all({
items: items,
actions: actionResource.getActions(items)
});
})
.then(function(data) {
applyActions(data.items, data.actions);
$scope.model.items = data.items;
return data.items;
});
plunker用于说明
关于javascript - 这个 promise 嵌套可以改成 chaining 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28637388/
我需要重命名目录中的所有文件。源文件名的一些示例是: alpha--sometext.381928 comp--moretext.7294058 生成的文件将重命名为: alpha.sometext.
我正在尝试编写一个方法,将 CDROM 驱动器从字母 D 更改为字母 Z,但对 WMI 没有任何运气。我可以使用 C# 执行此操作吗? public void setVolCDROM() {
考虑以下简单示例: namespace Calculus { type Func = { (arg: T): T; delta: (arg: T) => T; }; con
我编写了一个隐藏或显示所有应用程序形式(包括子形式)的方法。代码如下: public enum FormState { Show , Hidden, Enable, D
我创建了两个对象。 square1 和 square2 对象。我期望输出 Double line square object。但单个方形对象仅可见。如何做这个可见的双线方形对象? 在我的代码下面。 f
嗯,我有计算器。我想在其中接受值(value) $1,000,000格式 所以下面是我的代码,想知道如何使用 php 替换它们 直播:http://ffsng.deewayz.in/index.php
我看到 grunt.js 中的默认 linter 是 jshint,但我已经习惯了使用 jslint。是否可以更改 grunt.js 使用的 linter? 最佳答案 无耻的 self 推销 有一个插
我使用的是 EF Code First (.NET 4.5 + VS2012)。我的项目正在正确创建和使用 LocalDB。我的机器上也安装了 SQL Server Express (2008R2)。
我创建了包含 5 个 xib 的项目。当我尝试在 iPad 模拟器中运行该项目时。一些 Xibs 将采用 iPhone 屏幕尺寸。我想转换那些支持 iPad Xib 屏幕尺寸的 iphone xib。
我们的应用程序一直在工作。现在,在他们迁移到 bundler 1.0.7 之后,我第一次将一些新代码推送到 Heroku 上。现在我们的应用程序崩溃了,我收到了这个错误消息 - /usr/ruby1.
我是一名优秀的程序员,十分优秀!