2012-09-14 33 views
0

result填充exec函數,但它永遠不會回到主線程......我在做什麼錯了?nodejs纖維不適用於我

var Fiber, exec, execSync; 

    exec = require("child_process").exec; 

    Fiber = require('fibers'); 

    execSync = function(cmd) { 
    var cmdExec, final; 
    cmdExec = function(cmd) { 
     var fiber, 
     _this = this; 
     fiber = Fiber.current; 
     exec(cmd, function(se, so, e) { 
     var result; 
     fiber.run(); 
     result = se + so + e; 
     return result; 
     }); 
     return Fiber["yield"](); 
    }; 
    final = ''; 
    Fiber(function() { 
     return cmdExec(cmd); 
    }).run(); 
    return final; 
    }; 

    console.log(execSync('ls ..')); 

回答

2

有在該代碼的幾個問題。這裏是一些代碼,你想要做什麼:

var Fiber, exec, execSync; 

exec = require("child_process").exec; 

Fiber = require('fibers'); 

execSync = function(cmd) { 
    var fiber = Fiber.current; 
    exec(cmd, function(err, so, se) { 
    if (err) fiber.throwInto(err); 
    fiber.run(se + so); 
    }); 
    return Fiber.yield(); 
}; 

Fiber(function() { 
    console.log(execSync('ls ..')); 
}).run(); 

最大的問題是,你似乎是混合起來的runyield的作用。基本上yield暫停光纖,run將恢復(或第一次啓動)。你應該做的是運行任何需要在光纖中調用execSync的代碼,然後execSync將獲取對當前光纖的引用,然後調用Fiber.yield()。當exec呼叫返回時,光纖恢復爲fiber.run()

另一個較小的問題是exec回調的一些混淆參數。參數是err, stdout, stderr