2017-01-11 4 views
0

У меня есть длинная функция javascript, она может обрабатываться через несколько секунд. Но я хотел бы ограничить время выполнения javascript, если оно длиннее X секунды, независимо от результата выполнения функция будет убита. Возможно ли это реализовать в JS? Благодарю.Можно ли ограничить выполнение функции javascript?

+0

Как бы вы убиваете функцию? – samayo

+1

Вы можете сделать это с проверкой внутри самой функции (например, 'if (timeInFunction> 1000) return'). Вы не можете использовать какой-либо внешний супервизор, потому что JS имеет один поток выполнения. – joews

+0

Что вызывает функцию так много времени? Есть внутри петля? Это одна конкретная линия? – Weedoze

ответ

1

Я использовал обещания достичь этого. Я только начал 2 обещания: во-первых, это моя функция для выполнения обертки в обещании, вторая - обещание тайм-аута - когда операция считается неудачной и использует отказ в ней.

Использование Promise.race Я просто жду, какое действие будет выполнено в первую очередь. Если второй - отказ, если сначала - мой код успешно завершен.

Вот пример:

var p1 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 2000, "long_execution"); 
 
}); 
 

 
var p2 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 500, "ok"); 
 
}); 
 

 
var p3 = new Promise((resolve, reject) => { 
 
    setTimeout(reject, 1000, "reject"); 
 
}); 
 

 
Promise.race([p1, p3]).then(values => { 
 
    console.log(values); 
 
}, reason => { 
 
    console.log(reason) 
 
}); 
 

 
Promise.race([p2, p3]).then(values => { 
 
    console.log(values); 
 
}, reason => { 
 
    console.log(reason) 
 
});

+1

Это надежное решение для длительных задач async, но я думаю, что OP имеет блокирующий синхронный вызов функции. – joews

0

JavaScript является однопоточный, так что одна потребность использовать механизм асинхронной, чтобы добиться того, что вы пытаетесь сделать.

Один из способов сделать это с помощью единого обещания с помощью TimeOut. Если тайм-аут происходит, то вы обещаете Отклонить, и если не обещание, будет разрешено.

код образца может выглядеть как

var PTest = function() { 
    return new Promise(function (resolve, reject) { 
    setTimeout(function() { 
     reject(); 
    }, 2000) 
    // Lines of Code 
    resolve(); 
    }); 
} 
var myfunc = PTest(); 
myfunc.then(function() { 
    console.log("Promise Resolved"); 
}).catch(function() { 
    console.log("Promise Rejected"); 
}); 
Смежные вопросы