Итак, я пытаюсь моделировать некоторые длинные вычисления. для этого я вычисляю число фибоначчи. В случае, когда вычисление занимает много времени, мне нужно отклонить его.обещание Bluebird: почему это не тайм-аут?
Вопрос: Почему TimeoutErrror
обработчик не работает? Как исправить код?
const expect = require('chai').expect
const Promise = require('bluebird')
function profib(n, prev = '0', cur = '1') {
return new Promise.resolve(n < 2)
.then(function(isTerm) {
if(isTerm) {
return cur
} else {
n = n - 2
return profib(n, cur, strAdd(cur, prev));
}
})
}
const TIMEOUT = 10000
const N = 20000
describe('recursion', function() {
it.only('cancelation', function() {
this.timeout(2 * TIMEOUT)
let prom = profib(N).timeout(1000)
.catch(Promise.TimeoutError, function(e) {
console.log('timeout', e)
return '-1'
})
return prom.then((num) => {
expect(num).equal('-1')
})
})
})
const strAdd = function(lnum, rnum) {
lnum = lnum.split('').reverse();
rnum = rnum.split('').reverse();
var len = Math.max(lnum.length, rnum.length),
acc = 0;
res = [];
for(var i = 0; i < len; i++) {
var subres = Number(lnum[i] || 0) + Number(rnum[i] || 0) + acc;
acc = ~~(subres/10); // integer division
res.push(subres % 10);
}
if (acc !== 0) {
res.push(acc);
}
return res.reverse().join('');
};
Некоторая информация об окружающей среде:
➜ node -v
v6.3.1
➜ npm list --depth=0
├── [email protected]
├── [email protected]
└── [email protected]
Используете ли вы Mocha ?, какой тестовый бегун вы используете? – Hosar
добавлена информация об окружающей среде – kharandziuk
Единственный способ справиться с подобными вещами с помощью JavaScript - это сократить вашу обработку на небольшие шаги и позволить другому коду, чем ваш цикл, запускаться между этими шагами. Эффективный способ сделать это потребует рекурсивно-обещанных обещаний. Предпочтительно в WebWorker, чтобы вы не замедляли процесс пользовательского интерфейса. – Touffy