0

vmを使用してコードを実行しているときに問題に直面していますrunInNewContext

カスタム コードは、ネストされている可能性があり、ネストされたコール スタックを持つことができる promise を返すことができます。コードは次のようになります

 function executeInSandbox(code, sandbox){
  return Async((code, _sandbox) => {
    let fn = `"use strict";
              this.result = async(() => {
                  ${code}
              })();`;
    var script = new vm.Script(fn);
    return Await(
      script.runInNewContext(_sandbox, {
        displayErrors: true,
        timeout: 30000
      })
    );
  })(code, sandbox);
};
result = Await(executeInSandbox(code, sandbox))

問題は、20 秒以上かかる場合にプロミスの処理を停止したいということです。

コードが再帰的で入れ子になった promise がある場合、スタックされて 20 秒でコール スタックを実行しようとするため、数分以上かかり、停止できず、最後にスタック オーバーフローの問題が発生します。

次の追加で試しましたPromise.race

let timeout = new Promise((resolve, reject) => {
let id = setTimeout(() => {
  clearTimeout(id);
  reject('Timed out in '+ 2000 + 'ms.')
}, 2000);
});
let fn = `"use strict";
        this.result = async(() => {
            ${code}
        })();`;
var script = new vm.Script(fn);
let codePromise = script.runInNewContext(_sandbox, {
displayErrors: true,
timeout: 30000
});
return Await(
Promise.race([
  codePromise,
  timeout
])
);
})(code, sandbox);

コントロールを関数の外に残すように機能しますが、プロミスチェーンは実行を続けます。

を停止する方法はありcodePromiseますか? または Await でタイムアウトしますか?

4

2 に答える 2