В этом ответе приводятся подробности, демонстрирующие дополнительную структуру, которая поможет решить эту и другие проблемы раннего выхода, исключений, управления процессом и последовательной обработки функций в модульных JavaScript-сценариях. Решение предоставляет примеры закрытия. Этот ответ предполагает, что индивидуум хотел бы, чтобы другие сценарии на странице продолжали выполняться после выхода из указанного сценария.
Живой пример простого решения здесь: https://codepen.io/corpus_khu/pen/VpMQzO
<script>
var safetyRun = (function(){
var curExecution = null;
var exceptionHandlers = {
cleanup:function(){
/*do exit cleanup*/
console.log("Cleanup could set straglers to {}");
return;
}
}
var exitErr = function(errcode){
curExecution.exNames.push("cleanup");
throw new Error("EarlyExit");
}
var run = function(fun){
curExecution = this;
curExecution.exNames = [];
fun(exitErr);
for ( x in exNames){
exceptionHandlers[x]();
}
return;
}
return run;
})();
var exitThisScript = function(exit){
//write some modular code
console.log("before exit");
exit();
console.log("after exit");
return;
}
safetyRun(exitThisScript);
</script>
Выше очень простой способ выхода. Перед отправкой вашей функции этому «Бегунку» я рекомендую обернуть вашу функцию в тестовом жгуте, обернув объект, который загружает жгут и может быть выполнен; тестовый жгут должен предоставлять такие методы, как exit (), чтобы они не имели быть переданным.
Примеры всего, что вам нужно для построения хорошей стратегии выхода, доступны на github здесь (file: pseudo_threads2.js): https://github.com/fromSpace/js-recursionwithevents-practice
Демо-версия здесь:
https://fromspace.github.io/js-recursionwithevents-practice/
Обратите внимание, что в pseudo_threads2.js функция simConstantMomentum () возвращает функцию, имеющую лексические переменные области видимости со всеми функциями использования. Вместо этого я рекомендую вам вызвать генератор жгута в верхней части этой функции и присвоить его результат локальной переменной, чтобы функция, которую вы хотите выйти, выглядела больше так, когда вы закончите.
var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){
harness.scriptContextChangeEvent();
harness.imInteligentFunction("{slib_err-15346 : 'Cannot handle request, ::suggest(mesh//abc) exit back to pool'}");
harness.exit();
console.log("You should never get this far");
return true;
};
}
Решение, которое я здесь предоставил, - это то, которое я рекомендую, если вы намереваетесь построить контейнер для запуска javascript с такими встроенными возможностями, как exit, assert, mock и тому подобное. Я думаю, что это лучший способ построить этот контейнеровоз и сделать мои функции передаваемыми. - corpus_khu