gpt4 book ai didi

javascript - 异步函数 'post-cleanup'

转载 作者:行者123 更新时间:2023-11-28 01:13:47 25 4
gpt4 key购买 nike

我有这样的设置:我尝试使用自定义事件处理程序来处理 .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在这种情况下可能是一个有趣的想法。

  1. 观察您选择的隐藏 DOMElement
  2. 完成后想要使指针无效,请更改元素的属性
  3. 使用 mutations.forEach(function(mutation) 捕获突变并取消数组。

但无论如何,我认为您不应该尝试“猜测”何时使指针无效。根据定义,调用异步函数意味着您不知道它何时完成。

希望对你有帮助

关于javascript - 异步函数 'post-cleanup',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com