gpt4 book ai didi

javascript - 使用aspect.around,但检查相互调用的方法

转载 作者:行者123 更新时间:2023-11-28 08:38:51 25 4
gpt4 key购买 nike

我想针对 Dojo 商店的 put()add() 运行一些特定代码。我遇到的问题是,对于 JSON REST 存储,在 JsonRest.js add() 中只是一个调用 put() 的函数:

add: function(object, options){
options = options || {};
options.overwrite = false;
return this.put(object, options);
},

因此,如果我将 aspect.around()add() 一起使用,我的代码最终会被执行两次如果我应用我的使用将 add() 实现为 put() stub 的商店创建的代码。

请注意,我知道大多数商店都会这样做。我只是希望我的解决方案能够保证与任何商店一起使用,无论是否有方法嵌套。

Dojo 自己的 Observable.js 也有同样的问题。他们是这样处理的:

function whenFinished(method, action){
var original = store[method];
if(original){
store[method] = function(value){
if(inMethod){
// if one method calls another (like add() calling put()) we don't want two events
return original.apply(this, arguments);
}
inMethod = true;
try{
var results = original.apply(this, arguments);
Deferred.when(results, function(results){
action((typeof results == "object" && results) || value);
});
return results;
}finally{
inMethod = false;
}
};
}
}
// monitor for updates by listening to these methods
whenFinished("put", function(object){
store.notify(object, store.getIdentity(object));
});


whenFinished("add", function(object){
store.notify(object);
});
whenFinished("remove", function(id){
store.notify(undefined, id);
});

我的问题是:是否有一种简单、“简短”的方法来更改我现有的代码,以便检查它是否在方法内,并避免运行代码两次?

我尝试了一下,但最终得到了笨拙的、hacky 的代码。我确信我错过了一些东西......

这是我现有的代码:

topic.subscribe( 'hotplate/hotDojoStores/newStore', function( storeName, store ){

aspect.around( store, 'put', function( put ){

return function( object, options ){

return when( put.call( store, object, options ) ).then( function( r ) {
var eventName;
var identity = store.idProperty;
eventName = object[ identity ] ? 'storeRecordUpdate' : 'storeRecordCreate';

topic.publish( eventName, null, { type: eventName, storeName: storeName, objectId: r[ identity ], object: object }, false );

} );

}
});

aspect.around( store, 'add', function( add ){
return function( object, options ){

return when( add.call( store, object, options ) ).then( function( r ) {

var identity = store.idProperty;

topic.publish('storeRecordCreate', null, { storeName: storeName, storeTarget: storeTarget, objectId: r[identity], object: object }, false } );

});
}
});
});

最佳答案

这是我的尝试...对于我的尝试,我真正“了解”的是它是否 100% 安全。

如果store.add()连续调用两次,inMethod有可能被第一次设置为true调用,然后第二个 add() 调用发现它已经设置为 true,因为第一个调用尚未设法将其设置为 false?

只有在我假设的两个调用之间调用 nextTick() ,这才真正可能?

或者我只是对这一切感到完全困惑? (这很有可能......)

  topic.subscribe( 'hotplate/hotDojoStores/newStore', function( storeName, store ){

var inMethod;

aspect.around( store, 'put', function( put ){

return function( object, options ){

if( inMethod ){
return when( put.call( store, object, options ) );
} else {

inMethod = true;

try {
return when( put.call( store, object, options ) ).then( function( r ) {
var eventName;
var identity = store.idProperty;
eventName = object[ identity ] ? 'storeRecordUpdate' : 'storeRecordCreate';

topic.publish( eventName, null, { type: eventName, storeName: storeName, objectId: r[ identity ], object: object }, false );

});
} finally {
inMethod = false;
}

}

}
});

aspect.around( store, 'add', function( add ){
return function( object, options ){

if( inMethod ){
return when( add.call( store, object, options ) );
} else {

inMethod = true;

try {

return when( add.call( store, object, options ) ).then( function( r ) {

var identity = store.idProperty;

topic.publish('storeRecordCreate', null, { type: 'storeRecordCreate', storeName: storeName, objectId: r[identity], object: object }, false );

});
} finally {
inMethod = false;
}
}
}

});

aspect.around( store, 'remove', function( remove ){
return function( objectId, options ){

return when( remove.call( store, objectId, options ) ).then( function( r ) {

topic.publish('storeRecordRemove', null, { type: 'storeRecordRemove', storeName: storeName, objectId: objectId }, false );

});
};
});

});

关于javascript - 使用aspect.around,但检查相互调用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20735572/

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