Остановить цепочку обещаний или остановить возвращающую цепочку обещаний runInNewContext

Я столкнулся с проблемой с vm при выполнении кода с помощью runInNewContext,

Пользовательский код может возвращать обещание, которое может быть вложенным и может иметь вложенные стеки вызовов. Код выглядит следующим образом

 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 секунд.

Если код является рекурсивным и с вложенными обещаниями, он суммируется и в 20Sec, но теперь пытается выполнить стеки вызовов, что занимает больше минуты, не останавливается и, наконец, вызывает проблему переполнения стека.

Я попытался с последующим добавлением 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? или тайм-аут в ожидании?

2 ответа

Вы должны думать о 20-секундном таймауте как о основной функции вашего кода. Все обещания ДОЛЖНЫ либо разрешить, либо отклонить. Если функция требует тайм-аута, она должна сделать это, либо разрешив, либо отклонив. Не думайте, что вы можете вызвать это извне.

Решено с помощью внедрения кода через babel"s transformFromAst теперь.

Просто throw error если время выполнения превышает указанный интервал времени в начале каждого объявления функции и выражения функции.

Другие вопросы по тегам