Остановить цепочку обещаний или остановить возвращающую цепочку обещаний 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
если время выполнения превышает указанный интервал времени в начале каждого объявления функции и выражения функции.