Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Node.js运行代码_Javascript_Node.js_Node Fibers - Fatal编程技术网

Javascript 如何使用Node.js运行代码

Javascript 如何使用Node.js运行代码,javascript,node.js,node-fibers,Javascript,Node.js,Node Fibers,我有一个关于Nodejs光纤的问题(这对我来说是全新的)。。。 我有一个关于Nodejs光纤的教程,这里有一个例子 var fiber = Fiber.current; db.connect(function(err, conn) { if (err) return fiber.throwInto(err); fiber.run(conn); }); // Next line will yield until fiber.throwInto

我有一个关于Nodejs光纤的问题(这对我来说是全新的)。。。 我有一个关于Nodejs光纤的教程,这里有一个例子

    var fiber = Fiber.current;
    db.connect(function(err, conn) {
    if (err) return fiber.throwInto(err);
       fiber.run(conn);
    });
   // Next line will yield until fiber.throwInto 
   // or fiber.run are called
   var c = Fiber.yield();
   // If fiber.throwInto was called we don't reach this point 
   // because the previous line throws.
   // So we only get here if fiber.run was called and then 
   // c receives the conn value.
   doSomething(c);
   // Problem solved! 
现在基于这个例子,我创建了自己的代码版本,如下所示

  var Fiber = require('fibers');

  function sample(callback){
     callback("this callback");
  }

  var fiber = Fiber.current;
  sample(function(string){
     fiber.run(string);
  });
  var string = Fiber.yield();
  console.log(string);
但这给了我一个错误

/home/ubuntu/Tasks/ServerFilteringV1/test.js:28
    fiber.run(string);
      ^
TypeError: Cannot call method 'run' of undefined
我还有另外一个例子,它会在1000毫秒后运行一个函数,里面有回调(我这样做是为了测试函数在回调之前长时间执行)

这里的代码给了我另一个错误

/home/ubuntu/Tasks/ServerFilteringV1/test.js:30
var string = Fiber.yield();
                    ^
Error: yield() called with no fiber running
那么,在执行run()函数之后,yield()是否应该等待? 知道我的nodejs代码中发生了什么吗? 请提前感谢……

示例1 光纤是一种轻量级的执行线程。像真正的线程和进程一样,必须给光纤一个代码块,以便在运行时执行。您从bjouhier获取的代码无法正常工作。它打算在光纤中运行,如下所示:

var f=光纤(函数(){
var fiber=光纤电流;
样本(函数(str){
纤维(细绳);
});
var str=纤维产量();
console.log(str);
});
f、 run();
在光纤上调用
run
,运行光纤代码,该代码作为对
fiber
的回调。但是,上面的代码也会给出一个错误(说明光纤已在运行)。在分析执行顺序时,很容易看出原因

  • 将变量
    f
    设置为光纤
  • 运行光纤:
  • 设置变量
    光纤
    指向当前运行的光纤
  • 调用函数
    示例
  • 调用回调函数
  • 调用
    光纤。运行
    ,由于当前光纤已在运行,因此会出现错误
  • 此代码的结构是正确的,但它假定
    sample
    是某个不立即调用回调的异步函数。让我们用这个函数替换掉您的
    示例
    函数:

    function sample(callback) {
        setTimeout(function() {
            callback("this callback");
        }, 500);
    }
    
    现在,上面的代码不会发出错误,因为
    sample
    会立即返回。光纤内的执行顺序为:

  • 将光纤设置为指向当前正在运行的光纤
  • 调用
    示例
    ,返回时不调用回调(尚未调用)
  • 调用`Fiber.yield(),它“暂停”当前光纤
  • 500毫秒后,调用回调
  • 调用
    fiber.run()
    传递“此回调”,恢复光纤
  • Fiber.yield
    返回,
    str设置为“此回调”
  • 将字符串记录到控制台
  • 观察步骤4是否在光纤执行之外完成

    例2 而在第一个示例中没有运行的光纤(因此
    光纤
    未定义的),在第二个示例中,由于相同的原因引发错误。同样,代码需要在光纤中运行


    产量与产量的函数 一根光纤必须协同控制另一根光纤(或执行主线)。将其与线程和进程的抢占性质进行比较。放弃控制是“屈服控制”的意思,在这种情况下是通过
    Fiber.yield()
    完成的

    要继续执行(直接在光纤屈服点之后),必须在光纤上调用
    run()

    将值传入和传出光纤的机制是通过产量和运行的相互作用:

    • 提供给
      run
      (光纤外部)的参数由
      yield
      (光纤内部)返回
    • 给定给
      yield
      (光纤内部)的参数由
      run
      (光纤外部)返回

    例如,请查看上的增量生成器。此外,请注意我们的示例1,给
    sample
    的回调基本上是在光纤外运行的,因为它是在下一个滴答声(即
    setTimeout
    的异步性质)上运行的。

    正如Andrew所解释的,也正如我在博客文章中所暗示的(请参阅下面的示例句子),您必须创建一个
    Fiber
    并使用
    run()
    运行它,才能调用
    Fiber.yield

    <> P>当您有一个异步调用运行时,光纤的好处并不明显,但是请考虑一个函数:<代码> f1 < />代码>调用<代码> f2>代码>,调用<代码> f3。如果
    f3
    使用回调调用低级异步函数,并且如果不使用光纤,则必须将
    f3
    转换为具有回调的异步函数,然后通过传染,还必须将
    f2
    f1
    转换为异步函数。使用光纤,您可以将
    f1
    f2
    f3
    保持为正常功能(无需回调)。您将需要一些
    Fiber.yield()
    f3内部的魔法,您还需要从
    Fiber
    内部调用
    f1
    ,但您不需要担心
    f1
    f2
    主体中的回调

    因此,当您的高级函数和它们调用的低级异步函数之间有多层代码或复杂的控制流时,光纤确实会发光


    此外,编写fibers的Marcel建议不要直接在代码中使用
    Fiber.yield()
    ,而是使用他的futures库。使用
    Fiber.yield
    了解光纤是由什么组成的很有趣,但我鼓励您在实际项目中使用futures库。它还将帮助您并行化您的代码。

    如果问题中缺少一点,我很抱歉,我真正想要实现的是如何从回调中获得外部作用域或
    
    
    function sample(callback) {
        setTimeout(function() {
            callback("this callback");
        }, 500);
    }