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にファイバーを一時停止し、run再開します(または初めて開始します)。実行する必要があるexecSyncのは、ファイバー内で呼び出す必要のあるコードを実行execSyncし、現在のファイバーへの参照を取得してからを呼び出すことFiber.yield()です。execコールが戻ると、ファイバはで再開されますfiber.run()

もう1つの小さな問題は、のコールバックに対するいくつかの混乱したパラメーターですexec。パラメータはerr, stdout, stderrです。

于 2012-09-30T00:57:25.950 に答える