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