- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想针对 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/
在html中我可以设置背景图片的下面属性吗?(图片在iOS中我可以像下面这样设置图片的填充属性,但我不知道html中是否有类似的属性): Scale to Fill, Aspect Fit, Aspe
我一直在我的 OpenCV 和 OpenGL 组件之间来回切换,我不确定这两者中的哪一个应该更正这个问题。 使用 OpenCV 相机校准产生 fx、fy,纵横比大约为 1,这对应于正方形大小的图像。我
我正在使用 Perf4j 进行性能日志记录。 它指定您使用 aop.xml 来定义要在编译时调用哪个方面,具体取决于您使用的日志系统。我无法让它获取 src/main/webapp/meta-inf/
下方的分享图标(图片为白色)为 114x128 像素。 不过,使用 AutoLayout 将 Interface Builder 中的高度固定为 23 像素,然后对 Content Mode 使用 A
我正在尝试编写一个简单的 Spring Rest Web 服务,因为我不熟悉 Maven(并且因为 Maven 通常无法完成工作 - 连接问题),所以我现在正在尝试 ant 构建。现在,构建正常,服务
我使用网格和Flexbox布局了以下元素:。我希望在2x2的网格中布局.int元素,而.square元素的纵横比保持为1。。到目前为止,我有以下几个css:。如果视区的宽度大于高度(例如,横向),则可
I have the following elements laid out using both Grid and Flexbox:我使用网格和Flexbox布局了以下元素: <div
我在 UITableViewCell 中使用了 UIImageView,它将填充 contentView。我尝试了不同的模式,如“缩放以填充”、“Aspect Fit”、“” Aspect Fill”
我有一个方面排序列表。 public override void OnInvoke(MethodInterceptionArgs args) { args.Proceed(); var
我发现 Instagram 有一个像 300*300 这样的摄像头窗口?它是一个正方形,然后我尝试使用 GPUImage 制作相同的摄像头尺寸。所以我这样写: primaryView = [GPUIm
我一直致力于向 Spring MVC webapp 添加方面,但方面没有执行。我试图把它归结为一些简单的东西,显然应该可以工作,但仍然不行。这是我现在所处的位置: // imports... @Asp
我有一个运行特定逻辑的@After java 方面。我需要它返回一个结果(一个对象),该结果可以在方面切入点拦截的方法中使用。是否可以? 最佳答案 您需要的是@Around,它允许您将想要的任何内容返
SpringBoot@Aspect 打印访问请求和返回数据 为什么要用aspect, 使用aspect 可以使记录日志的功能面向切面,这样可以降低代码的耦合性。提供了两种方式对输入输出的数据进行打
我想从业务类中的方法访问局部变量,在方面类中的方法中。例如 class BusinessClass { public void simpleTest() { ...
我尝试使用 @Aspect 来记录所有请求和响应。如果我的端点有 @RequestBody,我的代码正在运行,但我的 get 端点没有 @RequestBody 并且我看不到日志。这是对这种情况的任何
我在学习AOP时遇到了一个场景。 所有类都在包com.spring内和Pointcut定义@AfterReturning Advice 的类型对于任何包类中的任何方法 com.spring具有任意数量
我是 alfresco 新手,我想创建一个能够提取自定义方面属性元数据的程序,我发现有人在谈论 Alfresco opencmis 扩展,但我不知道如何使用它,有吗我可以遵循教程吗? 最佳答案 如果您
你好我正在尝试使用 spring 注释和 AspectJ 实现一个方面但我不断收到错误 Aspect无法解析为类型 这是我的 pom.xml : org.spri
在我的网络系统中,我有一个像这样的 AppConfig 类 @Configuration @ComponentScan(basePackages = "com.mypackage") @EnableW
我有一个带有 spring 配置的应用程序服务器-客户端 RMI。现在我不会使用 @Aspect 添加方法调用日志记录。 我在 spring-context.xml 中添加了: 我的logger
我是一名优秀的程序员,十分优秀!