Javascript 有人知道允许延迟执行方法的JS链接库吗?
我正在寻找一个库,它允许我轻松地将方法链接在一起,但将它们的执行推迟到链中进一步提供参数:Javascript 有人知道允许延迟执行方法的JS链接库吗?,javascript,Javascript,我正在寻找一个库,它允许我轻松地将方法链接在一起,但将它们的执行推迟到链中进一步提供参数: chain .scanDirectory ( '/path/to/scan' ) .recursively() .for ( /\.js$/i ) .cache() .provideTo ( '0.locals' ) .as ( 'scripts' )
chain
.scanDirectory ( '/path/to/scan' )
.recursively()
.for ( /\.js$/i )
.cache()
.provideTo ( '0.locals' )
.as ( 'scripts' )
.defer();
重要的是,scanddirectory
函数背后的代码在定义为递归并查找.js
文件之前不会被实际调用
我不太确定如何在逻辑上设置它,以便我可以执行以下操作:
chain
.scanDirectory( '/path/to/scan' )
.scanDirectory( '/another/path' )
.for ( /\.js$/i ) // provided to both paths above?
.doSomethingElse()
var chain = function(){
var queue = []; // hold all the functions
function a(param){
//do stuff, knowing a is set, may also access other params functions set
}
return {
a:function(someParam){
queue.push({action:a,param:someParam});
return this;
},
... // more methods
run:function(){
queue.forEach(function(elem){ // on each item
elem.action.apply(null,param);//call the function on that item
});
}
};
}
这就是为什么我在寻找一个可能有更成熟想法的库来实现这一点:)请注意,您一定会找到一个全面的解决方案 看起来您正在寻找一个通用的解决方案,该解决方案需要已经烘焙到库中。我的意思是,我肯定有一些库具有此功能,但它们不会神奇地自动挂接在其他库上(除非它们专门为您想要针对的库的正确版本实现了覆盖) 但是,在某些情况下,您可能需要查看库,它可能包含了足够多的数据相关案例,使您对它感兴趣:如他的: 只需返回此 因此,对象中的每个方法都应该在return语句中返回对象,以便可以链接到另一个方法 例如:
var obj = new (function(){
this.methOne = function(){
//...
return this;
}
this.methTwo = function(){
//...
return this;
}
this.methThree = function(){
//...
return this;
}
})();
//So you can do:
obj.methOne().methTwo().methThree();
这篇文章讨论了JS中的执行类型,最后有到相关库的链接
JavaScript中的执行
JS中有两种执行类型:
- 同步-调用时发生的事情
- 异步-当前代码运行完成后发生的事情,也就是您所说的延迟
.run
命令运行它们
您可以执行以下操作:
chain
.scanDirectory( '/path/to/scan' )
.scanDirectory( '/another/path' )
.for ( /\.js$/i ) // provided to both paths above?
.doSomethingElse()
var chain = function(){
var queue = []; // hold all the functions
function a(param){
//do stuff, knowing a is set, may also access other params functions set
}
return {
a:function(someParam){
queue.push({action:a,param:someParam});
return this;
},
... // more methods
run:function(){
queue.forEach(function(elem){ // on each item
elem.action.apply(null,param);//call the function on that item
});
}
};
}
这将在调用run
时执行队列中的所有函数,语法如下
chain().a(15).a(17).run();
chain().a(16).a(17);
异步的
您只需设置一个超时,无需使用类似。为此运行
var chainAsync=函数(){
//不需要排队
function a(param){
//do stuff, knowing a is set, may also access other params functions set
}
return {
a:function(someParam){
setTimeout(a,0,someParam);
return this;
},
... // more methods
};
}
用法大概是
chain().a(15).a(17).run();
chain().a(16).a(17);
一些问题:
- 如果要在函数之间共享参数,可以将它们存储在对象本身的某个位置(除了队列之外,还具有
var状态)
- 它可以是同步的,也可以是异步的。您无法通过上下文检测其中一个。正在为ES6构建解决方案
更多资源
- 对于一些类似的实现,您可以看到我在哪里实现了一些类似的东西
- -Promissions允许您使用称为CPS(延续传递样式)的这种类型的执行,从而产生巨大的效果
- 靠承诺
- -最快、最有可能的最佳承诺库
- -可能是JavaScript中链接执行和承诺的最著名和最广泛使用的库。我自己使用过多次
- 问题在这里
- -另一个与此相关的问题
我不知道是否有一个库来构建这样的方法,但您可以自己轻松构建该功能。基本上,它将是一个带有setter方法的设置对象和一个execute
函数(在您的情况下,defer
)
这是构建方法的标准方法。当然,您也可以创建一个助手函数,将方法名传递给setting map,如果它太长,setting map会为您编写方法:-)您需要一个队列来维护方法链的异步和同步性
下面是我为一个项目使用jQuery.queue的实现:
function createChainable(options) {
var queue = [];
var chainable = {
method1 : function () {
queue.push(function(done){
// code here
done();
});
return chainable;
},
exec1 : function () {
queue.push(function(done){
// code here
done();
});
$.queue(ELEMENT, QUEUE_NAME, queue).dequeue(QUEUE_NAME);
return chainable;
}
};
return chainable;
}
试试那个。它是一个旧的,但很好:)@thinklinux:确实不错,但我不确定这正是他心目中的范例。不过很有趣。(我想你应该把它作为一个答案)“Hayele:这基本上只是一个链接,所以我把它转换成一个注释。”@ thefMeist:好的,好的点,但是也许首先用一个注释通知TykLinux首先是更好的,因为他可以把他的答案立即扩展。当我切换到我的评论的时候,我是正确的。许多人草草地写出了答案。从简单的事情开始,我知道,如果我在我的后续打字过程中,我会意识到我的答案已经被删除,我现在需要创建一个新的,因为我没有得到10分钟编辑“宽限期”。@thinklinux--Chain看起来很酷,但它是非常线性的。我想把它分解一下:)是的,我正在寻找一个类似于promise库的东西,它有更多的功能。Stream看起来很酷,但似乎是一个非常不同的想法,我试图实现:)你的帖子被删除了,因为它被粘贴在两个地方。@GeorgeStock呃,另一篇文章被OP删除了……我不知道当另一篇文章不存在时,你怎么能删除这篇文章?这是内部脚本吗?这并不能真正解决试图将参数引入方法的问题somehow@GeorgeStocker这是一个奇怪的错误…但请下次删除时检查以确保您正在删除t他说得对:-)谢谢,你是个友好的邻居Neal^^我从没说过这是个bug。是的,我知道我可以构建一个bug,但我想我需要内置的承诺等等。但是你的模型不太管用,例如,在我想methodA().as('foo').methodB().as('bar')的情况下
methodB
需要得到methodA
的结果,使用不同的作为
参数,并且没有最终调用……实际上,我只看到这种模式用于初始化实例,而不是为方法提供参数。我想的一些方向是:1)将作为
t