나는 이런 종류의 설정을 가지고있다. 사용자 정의 이벤트 처리기를 사용하여 .data
해시를 처리하고 처리기를 실행 한 후 가비지 수집하여 불필요하게 보관하지 못하게하려고한다. 메모리 등등 .defer()
함수는 내가 얻은 것을 시뮬레이션하고, 비동기 적으로 실행되는 제공되는 함수를 기반으로 함수를 생성하여 원시 이벤트 처리를 모방하려고합니다 ...
저를 혼란시키는 것은 데이터 항목을 삭제하는 것입니다. ... = null;
을 할당 한 후 deferred 함수를 호출 한 후 함수가 실행되기 전에 실행되는 것처럼 보이며 기본적으로 실행 순서 (?!)를 반전하여 작업 할 데이터가없는 함수가 남습니다.
여기 내가 가지고있는 스크립트입니다 :비동기 함수 'post-cleanup'
//
//
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
예, 다른 콜백을 사용하는 솔루션은 기본적으로 이동하는 방법입니다. 'action'을 고치지 않고 단순히 감싸는 것만으로 간단하게 포장 할 수 있습니다. 다른 고차원 함수를 사용하여 더 멋진 코드를 얻을 수 있습니다. – Bergi