Javascript 如何使用Node.js运行代码
我有一个关于Nodejs光纤的问题(这对我来说是全新的)。。。 我有一个关于Nodejs光纤的教程,这里有一个例子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
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.run()
传递“此回调”,恢复光纤Fiber.yield
返回,将str设置为“此回调”
光纤
是未定义的),在第二个示例中,由于相同的原因引发错误。同样,代码需要在光纤中运行
产量与产量的函数 一根光纤必须协同控制另一根光纤(或执行主线)。将其与线程和进程的抢占性质进行比较。放弃控制是“屈服控制”的意思,在这种情况下是通过
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);
}