- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的设置:我尝试使用自定义事件处理程序来处理 .data
哈希,并在处理程序运行后“垃圾收集”它的项目,以避免保留它们不必要地在内存中等等。 .defer()
函数模拟我得到的东西,它根据提供的异步运行的函数生成函数,试图以这种方式模仿 native 事件处理......
让我困惑的是,通过分配 ... = null;
来删除数据项,在调用延迟函数之后似乎在函数执行之前运行,基本上颠倒了执行顺序(?!),留下了一个没有数据可使用的函数...
这是我的脚本:
//
//
var defer = function(func) {
// get asynchronoused `.func()` version
return function() {
// cache inputs for use by defered function
var args = arguments;
var node = this;
return setTimeout(
function() {
func.apply(node, args);
}
), node;
};
};
var action = function(node) {
// process a node
console.log(node['@foo']['txt']);
};
var data = {
'@foo': {
'id' : '#foo',
'tag' : 'h2',
'txt' : 'stuff',
},
'@spam': {
'id' : '#spam',
'tag' : 'h1',
'txt' : 'and shit',
},
};
// run `.action()` asynchronously
defer(action)(data);
// garbage collect after
data['@foo'] = null;
// this part seems to run before function call
// cleaning the data before `defer(action)(data);` gets it's time
// it throws error here because `null` gc-ed it right away (or something)
// TypeError: node['@foo'] is null
//
<小时/>我目前正在通过向回调提供附加函数(
_finaly()
)来解决这个问题,这些函数将在处理数据后立即运行清理,这对于简单的事情来说似乎非常尴尬和不自然。问题是为什么这段代码似乎乱序,
这里到底发生了什么,或者是否有更干净的方法来解决这个问题?
这是我迄今为止得到的解决方案:
var action = function(node, _finaly) {
// provide `._finaly()` callback
// that will run after processing gets done
/////
console.log(node['@foo']['txt']);
// .. and run the cleanup code
_finaly && _finaly(node, 'txt');
};
defer(action)(data, function (node, item) {
// do the house-keep in a callback here
// rather than directly after execution
node.hasOwnProperty(item) && (node[item] = null);
});
//
// eof
最佳答案
因此,正如 Bergi 所说,您观察到的行为是可以预期的。主调用堆栈始终在任何异步调用开始之前完成。如果您对 defer
的调用超过 1 次,您甚至不知道哪一个会先执行。
为什么不在 action
函数调用中清理数组呢?我知道这可能会破坏实现逻辑并且并不总是可行。如果是这样,您可能想使用 native 事件。例如,使用 MutationObserver在这种情况下可能是一个有趣的想法。
DOMElement
mutations.forEach(function(mutation)
捕获突变并取消数组。但无论如何,我认为您不应该尝试“猜测”何时使指针无效。根据定义,调用异步函数意味着您不知道它何时完成。
希望对你有帮助
关于javascript - 异步函数 'post-cleanup',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099416/
我们在 Jboss EAP 6.20 Beta1 上看到以下警告 2014-04-01 03:00:00,539 WARN [LocalManagedConnectionFactory:cleanu
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 9 个月前关闭。 Improve t
我们的 TeamCity 服务器现在运行了大约 3 年,每个工件都保存在硬盘上。现在硬盘快满了。 我查看了清理规则,有: Everything older than the 5th successfu
这个问题已经有答案了: Is there a destructor for Java? (24 个回答) 已关闭 8 年前。 我正在将一些 C++ 代码移植到 Java,这些代码使用非常常见的 C++
我目前是 Hadoop 的新手。所以我在 MapReduce 中解决了这段代码,它找出了“每年‘数据工程师’工作最多的国家/地区的部分”(例如,如果格式为 (Year,Region ,Count(Jo
为了在运行测试之前设置环境,我使用了 GebConfig.groovy 类,它在运行测试时作为第一个组件被触发。但我还需要在所有测试完成后将环境恢复到初始状态。 我试图覆盖扩展 GebReportin
我有这样的设置:我尝试使用自定义事件处理程序来处理 .data 哈希,并在处理程序运行后“垃圾收集”它的项目,以避免保留它们不必要地在内存中等等。 .defer() 函数模拟我得到的东西,它根据提供的
“使用 finally block 允许您运行任何您想要执行的清理类型的语句,无论 protected 代码中发生了什么。”“清理类型语句”和“清理代码”是什么意思? 最佳答案 如评论中所述,“清理”
我不明白 Hadoop 中的清理方法到底是做什么的,它是如何工作的?我有以下 Map-Reduce 代码来计算一堆数字的最大值、最小值和平均值。 public class Statistics {
我对此很陌生,并且对垃圾收集对于无需重新启动的插件的确切工作方式感到有点困惑。 从我的关闭函数中,我当前调用所有必须进行清理的对象。他们将任何事件处理程序删除到他们可能设置的外部代码中,然后删除自己的
使用C++管道api(1.2.0),如何在映射器的map()阶段之后在Mapper.cleanup()中获得调用?基本上,对于每个块,我想在映射阶段将记录存储在内存中,然后再进行一些处理。 欢迎任何提
我编写了一个 eclipse osgi 插件,它对 eclipse 项目中存在的 java 文件运行清理和格式化操作。比如: 运行包含 eclipse 命令的批处理文件 它打开 Eclipse 编辑器
我想知道是否可以在 Spock 测试的生命周期方法中提供以下数据: setup() 方法中的测试名称 cleanup() 方法中的测试名称和测试结果 我问的原因是我想将这些元数据发送到数据接收器,而无
我读到使用 malloc() 时的规则是始终有一个匹配的 free()。如果一个程序中使用了 7 次 malloc(),则必须有相应数量的 free()。但是,这似乎不适用于我在结构内部 malloc
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 JUnit 和 FEST 对我们的应用程序进行 Swing 集成测试,我在测试用例中多次启动和停止。 @after 是否应该包含对 robot.cleanUp() 的调用? 最佳答案 一般规则
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
文档和搜索让我对如何清理提交历史感到困惑。 假设我有一个名为 tests 的分支,我用它来将构建推送到 travis-ci,但我的构建失败了。然后我将不得不做一些小的提交来尝试修复错误消息并重新推送
我们每天使用 capistrano(实际上是 webistrano)进行 20 多次部署,但我们遇到了一个问题,即我们服务器上的磁盘空间充满了旧的部署文件夹。 我时不时地运行 deploy:clean
1、cmd指令,进入.svn目录,找到wc.db文件 sqlite 3 打开 2、 对 svn源代码目录 右键, clean up, 稍等1至5分钟左右,然后会提示 清理成功 以上就是小编为
我是一名优秀的程序员,十分优秀!