2017-01-11 3 views
0

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?

+0

Wie würden Sie eine Funktion töten? – samayo

+1

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

+0

Was verursacht die Funktion so lange? Ist da eine Schleife drin? Ist das eine bestimmte Linie? – Weedoze

Antwort

1

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) 
 
});

+1

Dies ist eine saubere Lösung für lang laufende asynchrone Tasks, aber ich denke, das OP hat einen blockierenden synchronen Funktionsaufruf. – joews

0

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

aussehen
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"); 
}); 
Verwandte Themen