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 でタイムアウトしますか?