Ich habe eine lange Javascript-Funktion, kann es ein paar Sekunden verarbeiten. Aber ich möchte die Javascript Ausführungszeit beschränken, wenn es länger als X Sekunde ist, was auch immer das ausführende Ergebnis, die Funktion wird getötet werden. Ist dies in JS möglich? Vielen Dank.Ist es möglich, JavaScript-Ausführungszeit zu begrenzen?
Antwort
Ich habe Versprechungen, dies zu erreichen. Ich habe gerade 2 Versprechungen gestartet: erstens ist meine Funktion, Wrapper in Versprechen ausgeführt werden, zweitens ist Timeout Versprechen - wenn Betrieb als fehlgeschlagen betrachten und verwenden Sie ablehnen in ihm.
Mit Promise.race
Ich warte nur, welche Aktion zuerst abgeschlossen ist. Wenn die zweite Zurückweisung auftritt, wird der Code erfolgreich abgeschlossen.
Hier ist Beispiel:
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)
});
Dies ist eine saubere Lösung für lang laufende asynchrone Tasks, aber ich denke, das OP hat einen blockierenden synchronen Funktionsaufruf. – joews
JavaScript ein Single-Threaded ist, so braucht man Asynchron-Mechanismus zu verwenden, um zu erreichen, was Sie zu tun versuchen.
Eine Möglichkeit, dies mit einem einzigen Versprechen mit TimeOut zu tun. Wenn eine Zeitüberschreitung auftritt, wird das Versprechen abgelehnt und falls nicht, wird das Versprechen gelöst.
Ein Beispielcode kann so etwas wie
aussehenvar 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");
});
- 1. Wie ist es möglich, die Download-Geschwindigkeit zu begrenzen?
- 2. Ist es möglich, die Berechtigungen pro Prozedur zu begrenzen?
- 3. GLMM- Ist es möglich, variable Kombinationen zu begrenzen?
- 4. Ist es möglich, gleichzeitige Builds in bestimmten Konfigurationen zu verhindern?
- 5. Wie ist es möglich, die Anzahl der Instanzen eines EJB zu begrenzen?
- 6. Ist es möglich, die Anzahl gleichzeitiger Builds in Travis-CI zu begrenzen?
- 7. Ist es möglich, die Größe einer @ OneToMany-Sammlung mit Hibernate- oder JPA-Anmerkungen zu begrenzen?
- 8. Es ist möglich, die benutzerdefinierten Module für eine Multisite zu begrenzen?
- 9. Ist es möglich, die Zeilen pro Wert in einer WHERE col IN (...) Anweisung zu begrenzen?
- 10. Chosen.js - ist es möglich, die Anzahl der ausgewählten Elemente zu begrenzen?
- 11. Es ist möglich, die Anzahl der verschachtelten Plugins in django-cms zu begrenzen?
- 12. AppleScript: Ist es möglich, Stringlängen zu begrenzen, die in Safari-Textfeldern eingegeben werden können?
- 13. Ist es möglich, die CPU-Auslastung eines externen Prozesses zu begrenzen?
- 14. Ist es möglich, die Ordnergröße in einer Windows-Umgebung zu begrenzen?
- 15. Ist es möglich, die Anzahl der Autocomplete-Box-Zeilen zu begrenzen?
- 16. AIR TV - ist es möglich, den maximalen Speicher für die Laufzeit zu begrenzen?
- 17. Ist es möglich, die Zeilen zu begrenzen, die die Formel sort() in Google SpreadSheet ausgibt?
- 18. JavaScript - Ist es möglich, die Ergebnisse einer FOREACH-Schleife zu begrenzen?
- 19. TinyMCE: Möglich zu begrenzen, um nur Kugeln zu erlauben?
- 20. Ist es möglich, Spracherweiterungen zu "verstecken"?
- 21. Ist es möglich, Global.asax zu debuggen?
- 22. Ist es möglich, die Kontextwechselzeit zu reduzieren
- 23. Ist es möglich, Wordnet Lemmizer zu beschleunigen?
- 24. Ist es möglich, drawableLeft programmgesteuert zu setzen?
- 25. Ist es möglich, ein Icon zu verschieben?
- 26. Ist es möglich, Commits zu widerrufen?
- 27. Ist es möglich, Schriftarten skalierbar zu machen?
- 28. Ist es möglich, Inline-Vorlagen zu verwenden?
- 29. Ist es möglich, einen Operationshaken zu entfernen?
- 30. Ist es möglich, HHVM zu umgehen?
Wie würden Sie eine Funktion töten? – samayo
Sie können es mit einer Überprüfung innerhalb der Funktion selbst tun (z. B. 'if (timeInFunction> 1000) return'). Sie können keinen externen Supervisor irgendeiner Art verwenden, da JS einen einzelnen Ausführungsthread hat. – joews
Was verursacht die Funktion so lange? Ist da eine Schleife drin? Ist das eine bestimmte Linie? – Weedoze