0

result填充在函数exec中,但它永远不会回到主线程......我做错了什么?

  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 ..'));
4

1 回答 1

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();

最大的问题是您似乎混淆了 和 的run角色yield。基本上yield暂停 Fiberrun并将恢复(或第一次启动它)。您应该做的是运行任何需要execSync在 Fiber 内部调用的代码,然后execSync获取对当前 Fiber 的引用,然后调用Fiber.yield(). 当exec呼叫返回时,光纤将恢复为fiber.run()

另一个较小的问题是exec. 参数是err, stdout, stderr

于 2012-09-30T00:57:25.950 回答