- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Promise 重写一些“旧”代码。目前,代码使用自己的堆栈,可以从所有回调访问该堆栈,有时将新项目添加到堆栈中,直到堆栈为空,然后运行最终的回调,以所有收集的数据的漂亮格式(也可以在所有回调中访问)回调)。
这里的要点是:stack
和data
可以从所有回调中访问,因此每个回调都可以使用添加到
。最终结果始终是一维数组。data
>推
Promise.all([a, b])
a
添加到 data
即可b
可能会添加到 data
中,仅此而已,但更有可能产生更多的 Promise数据
和/或产生更多 promise 对于 b
中的每个新生成,之前的结果都是必需的,因此我无法使用 a
和 b
一起启动它们.
我做了一个简化的演示:http://jsfiddle.net/rudiedirkx/6r5smkz5/ (检查控制台并点击空白主体再次运行)
b
返回标量(立即数据)因此数据可能如下所示:
[a, b]
[a, [b, b]]
[a, [b, [c, c, c], [c, c]]]
(演示中没有,只有 2 个级别)等等
它应该总是这样:
[a, b, c, c, c, c, c]
(1D,任意数量的元素)在每个 then(callback)
中,我只有来自 P.all
的结果,而不是全部,直到最后一次完成,其中格式可以是任何东西。
这是处理器:
console.time('ALL LOADED');
Promise.all([local(), sync()])
.then(function(data) {
// data[0] (from a) is always scalar
// data[1] (from 1 or more b's) might be Array
if (data[1] instanceof Array) {
data[1].unshift(data[0]);
return data[1];
}
return data;
})
.then(function(data) {
console.log('DONE', data);
console.timeEnd('ALL LOADED');
console.log('');
});
如您所见,第一个 then(callback)
将数据格式化为我需要的一维数组。这个很简单,但是级别越多,规模就越大。
我的问题主要是:这是正确的方法吗?不是有一个“在每个then(callback)
”之后可以轻松地格式化数据吗?或者甚至更好:更容易访问全局数据
,就像我当前的设置一样。
或者在第一个 P.all
堆栈仍在运行时添加到它?那是最好的。只有 1 个 then(callback)
和一个 data
,但大小可变。
promise 很酷,但复杂的事情仍然很复杂,甚至更复杂。
最佳答案
我之前没有尝试过在递归中使用 Promise,所以我稍微搞了一下。我不确定这对您是否有帮助,但这对我来说很有趣。
我仍在努力不使用 globalData 变量作为累加器,但是在 promise 中传递累加器会有点奇怪,我还不知道为什么。
var prom = require('bluebird'),
_ = require('lodash'),
globalData = []
/**
* return a number 1/2 of the time, array rest of the time
*/
function asyncSometimesArrayDataSource() {
if (Math.random() > 0.5) {
return prom.resolve(2);
} else {
return prom.resolve([1, 2]);
}
};
function asyncAlwaysIntDataSource() {
return prom.resolve(2);
}
function recursivePromises(arr) {
return prom.all(asyncSometimesArrayDataSource()
.then(function (data) {
if (data instanceof Array) {
return prom.all(data.map(function (val) {
globalData.push(val)
return recursivePromises();
}));
} else {
globalData.push(data);
return globalData;
}
}));
}
asyncAlwaysIntDataSource()
.then(function (easyData) {
return recursivePromises()
.then(function () {
return globalData;
});
})
.then(function (finaldata) {
console.log('final data', finaldata);
});
这是之前尝试的改进版本,没有外部累积数组。
var prom = require('bluebird'),
_ = require('lodash'),
// count is used to verify that the final array is the correct length
count = 0;
/**
* return a number 1/2 of the time, array rest of the time
*/
function asyncSometimesArrayDataSource() {
if (Math.random() > 0.5) {
return prom.resolve(2);
} else {
return prom.resolve([4, 5]);
}
}
function asyncAlwaysIntDataSource() {
count++;
return prom.resolve(2);
}
function recursivePromises(arr) {
return asyncSometimesArrayDataSource()
.then(function (data) {
if (data instanceof Array) {
return prom.map(data, function (val) {
count++;
return recursivePromises([val]);
}).then(function (mapdata) {
return arr.concat(mapdata);
});
} else {
count++;
arr.push(data);
return arr;
}
});
}
asyncAlwaysIntDataSource()
.then(function (easyData) {
return recursivePromises([easyData])
})
.then(function (finaldata) {
console.log('final data', _.flatten(finaldata), count, _.flatten(finaldata).length);
});
关于javascript - Promise 扩展到更多的 Promise 会导致不可预测的数据格式(以及不可读的代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26568949/
如何将浮点 10 字节十六进制字符串(Delphi 中的扩展数据类型)转换为 C# 数据类型? 例如:00 00 00 00 00 00 00 80 ff 3f 在 Delphi 1 最佳答案 涉及同
我正在阅读 this page上面写着 If one of the strings has an encoding prefix and the other doesn't, the one that
我有以下代码(作为示例),我想对其进行调整,以使功能区扩展到整个 xrange,如 geom_hline()做。功能区指示哪些值在可接受的范围内。在我的实际应用程序中,有时没有上限或下限,因此 hli
去年,斯科特·格思里 stated “如果您想要对执行的 SQL 进行绝对控制,您实际上可以覆盖 LINQ to SQL 使用的原始 SQL”,但我找不到描述可扩展性方法的文档。 我想修改以下 LIN
我尝试在我的应用中创建一个抽屉导航。我有 3 个当前选项(查看、声明、报告),当然这 3 个 Activity 已扩展到 fragment。在View 中,它有一个next 按钮,该按钮将转到另一个页
很抱歉,如果我的问题被重复,但我无法(或不知道如何谷歌)找到答案。我想使用 rxlifecycle-navi 库来将 rxjava 绑定(bind)到生命周期,所以我需要扩展 NaviActivity
有这个html: aaa 做的时候: $('#hi1').sayHi(); 我想收到一条“嗨”提醒 有人知道这是怎么做到的吗? 最佳答案 了解更多关于jQuery plugin authoring
我有一个 UIImageView 和一个 UITextView。当点击 UITextView 时,我需要 UITextView 在 UIImageView 上展开。我不知道该怎么做。 从这里 为此 最
以下语句: URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class uclc = ucl.get
以下语句: URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class uclc = ucl.get
$的意思是什么!在 shell 或 shell 脚本中?我正在尝试理解具有以下内容的脚本。 local@usr> a=1 local@usr> echo $a 1 local@usr> echo $!
我正在 GWT 中设计一个简单的应用程序,并且在客户端有不同的 View 。每个 View 都从 SimplePanel 扩展而来,并将根据需要添加到 RootPanel。 我的第一个 View 是
我尝试在 SQL Azure 选项卡中从 S2 扩展到 S3,但 S3 似乎不可用,尽管它已被引入。另外,我还有大量可用的 DTU,即 1900 左右。是否无法扩展到 S3?我是否需要导出数据库,然后
我有一个带有 JS、html 和 css 的自定义视频播放器。我的问题的关键是我没有预料到将其从一个视频扩展到两个视频,我希望重构它,以便我可以在一个页面上播放多个视频。我尝试将所有内容重写为 for
我当前正在开发的应用程序需要可扩展的实时通信。我们一直在研究并尝试 Firebase 实时数据库和 firestore。看来Firebase实时数据库更加成熟并且经过测试,而firestore仍处于测
当 pod 被 daemonset 控制时,pod 会出现一些错误,状态会是 CrashLoopBackOff ,我想删除这些 Pod 但不想删除 DaemonSet。 所以我想把daemonset缩
我有 Jframe 表单并创建了从中绘制图形的类,为此我需要将该 void 类扩展为 jframe 表单 package grafiktest; import java.awt.Color; impo
在布局和尺寸策略方面,我从来都不是太出色,所以这可能是一个简单的答案,但就是这样。 当我向 QTabWIdget 添加新选项卡并将小部件设置为 QSplitter 时,拆分器将使用给定的全部空间量。但
我在将我的 S4 对象转换回列表时遇到了一些问题。例如,以下嵌套的 S4 类: setClass("nssItem", representation(value = "numeric
在阅读了 DDD 的一些页面后,我了解了存储库模式,然后在应用程序中成功使用了它(我真的很喜欢它);然后我注意到 EntityManager 是 generic-repository-like,但是当
我是一名优秀的程序员,十分优秀!