كيفية إنهاء البرنامج النصي في جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/550574

  •  23-08-2019
  •  | 
  •  

سؤال

كيف يمكنني الخروج من البرنامج النصي Javascript كثيرا مثل PHP exit أو dieب أعلم أنها ليست أفضل ممارسة البرمجة ولكني بحاجة إليها.

هل كانت مفيدة؟

المحلول

جافا سكريبت أي ما يعادل PHP die. وبعد راجع للشغل فقط exit() (شكرا جفافنا):

function exit( status ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null

    var i;

    if (typeof status === 'string') {
        alert(status);
    }

    window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false);

    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',
        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];

    function stopPropagation (e) {
        e.stopPropagation();
        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    }

    if (window.stop) {
        window.stop();
    }

    throw '';
}

نصائح أخرى

عادة ما تقوم بوظائف "الخروج" عادة بالبرنامج أو البرنامج النصي مع رسالة خطأ كأملاك. على سبيل المثال يموت (...) في PHP

die("sorry my fault, didn't mean to but now I am in byte nirvana")

ما يعادل JS هو الإشارة إلى خطأ مع يرمي الكلمة الأساسية مثل هذا:

throw new Error();

يمكنك اختبار هذا بسهولة:

var m = 100;
throw '';
var x = 100;

x
>>>undefined
m
>>>100

حتى في برامج بسيطة دون مقابض، والأحداث، ومن الأفضل وضع التعليمات البرمجية في وظيفة "الرئيسية"، حتى عندما يكون الإجراء الوحيد:

<script> 
function main()
{
//code

}
main();
</script>

بهذه الطريقة، عندما تريد إيقاف البرنامج، يمكنك استخدام "العودة".

هناك طرق عديدة للخروج من برنامج JS أو Node Script. فيما يلي الأكثر صلة:

// This will never exit!
setInterval((function() {  
    return;
}), 5000);

// This will exit after 5 seconds, with signal 1
setTimeout((function() {  
    return process.exit(1);
}), 5000);

// This will also exit after 5 seconds, and print its (killed) PID
setTimeout((function() {  
    return process.kill(process.pid);
}), 5000);

// This will also exit after 5 seconds and create a core dump.
setTimeout((function() {  
    return process.abort();
}), 5000);

إذا كنت في إرجاع (أي بعد الجري node في سطر الأوامر)، يمكنك الكتابة .exit للخروج.

إذا كنت لا تهتم بأنه خطأ ما يكتب فقط:

fail;

من شأنها أن توقف رمزك الرئيسي (العالمي) من المتابعة. مفيدة لبعض جوانب التصحيح / الاختبار.

ضع ال debugger; الكلمة الرئيسية في رمز JavaScript الخاص بك حيث تريد إيقاف التنفيذ. ثم افتح أدوات مطور المتصفح المفضلة لديك وإعادة تحميل الصفحة. الآن يجب أن تتوقف تلقائيا. افتح ال مصادر قسم أدواتك: debugger; يتم تمييز الكلمة الرئيسية ولديك خيار استئناف تنفيذ البرنامج النصي.

اتمني ان يكون مفيدا.

مزيد من المعلومات في:

في حالتي استخدمت window.stop API الذي يشبه النقر فوق الزر X على المتصفح الخاص بك:

window.stop();

توفر هذه الإجابة تفاصيل توضح إطارا إضافيا سيساعد في حل هذا وغيرها من الخروج المبكر والاستثناءات والتحكم في العملية واحتياجات معالجة الوظائف المتسلسلة في JavaScripts JavaScripts. يوفر الحل أمثلة إغلاق. يفترض هذه الإجابة أن الفرد يود أن تستمر البرامج النصية الأخرى الموجودة في الصفحة للاستمرار في تشغيلها بعد خروج البرنامج النصي المعني.

مثال حي للحل البسيط هنا: https://jsfiddle.net/alignedfibers/cpe1o1yy/66/

<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>

أعلاه هو "Callrunner" يوفر طريقة بسيطة للغاية للخروج مجانا من خلال تمرير وظيفتك إلى عداء.

قد تكون التسمية المتغيرة في الكمان مربكة، وهناك الوظيفة المسماة "المتعة" هي الاسم المستخدم ضمن SAFETYRUN للإشارة إلى الوظيفة التي نحاول الخروج منها، والتسمية هي الاسم المستخدم للإشارة إلى الوظيفة التي نريدها لإكمال الخروج فعليا. أيضا مربكة صغيرة هي: بمجرد اكتمال ENDERRER، لا يزال إطار المكدس لا يصرح من مؤشر ترابط التحكم الذي يسمى الوظيفة التي خرجناها. نظرا لأننا لا نزال لدينا خيط عنصر تحكم، يمكننا استخدام الوظائف أو رموز الأخطاء التي يتم دفعها إلى صفيف في دالة ERORTERR واتصل بها إيقاعا قبل الإرجاع للسماح بأي وظائف أخرى لتشغيلها. هذا يسمح لنا بتغيير أي أوزان أو إجراء تصحيحات أو تعيين أي دولة تحتاج إلى أن نتمكن من استخدامها لتنبيه حالات تصحيح الأخطاء التي تحتاج إلى اهتمامها أو إرسال تقرير سجل أو حتى تنظيف صعبة للغاية وإصلاح الوظيفة بشكل مستقل في الخلفية واستدعاء ERORERERR حتى يكمل عودة بدلا من رمي، مما يسمح للوظيفة التي نحاول الخروج من الإكمال المبكر، (تشير إلى القيام بذلك OffmainThead). يمكن أن يكون هذا "المجمع / تسخير" طريقة جيدة للتحقق من إصدارات المتصفح والأشياء في بداية الدالة، يمكنك حتى القيام باستيراد ثابت أو ديناميكي هنا إذا قمت بإدارة المكتبات الخاصة بك أو ما يمكنك التفكير فيه حقا. EXIT هو وظيفة طامة واحدة فقط يمكن إتاحة لوظائفك عن طريق التفاف هذا مثل هذا.

يعد الرمز الموجود في البند القذرة قليلا وغير جميلة، يمكن أن تجعل ES6 ES6 الجديدة أن تجعل هذا أجمل. بالإضافة إلى ذلك، أوصي بأن تسمون مولد تسخير في الجزء العلوي من هذه الوظيفة ويعين ناتجها إلى VAR محلي، لذا فإن الوظيفة التي تريد الخروج منها يمكن أن تبدو وكأنها الكود أدناه. من أجل الحفاظ على موضوع التحكم دون الافراج عن المكدس، ستظل بحاجة إلى حاجة للحصول على harness.run (وظيفة (تسخير) {/myvanillafunc./}) لف وظيفة الفانيليا الخاصة بك، وإلا يجب أن تعمل أدناه من الناحية النظرية. التفاف هو بالضبط ما فعلته في رمز الخروج أعلاه أعلاه.

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){ /*wrapper would wrap these internals*/
        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 مع قدرات مثل الخروج، وتأكيد، وهمية ومؤديها. أعتقد أن هذه هي أفضل طريقة لبناء هذه الحاويات وجعل بلدي وظائف حالية.

إذا كنت تبحث عن وسيلة لإنهاء تنفيذ جميع جافا سكريبت قسرا على الصفحة، فأنا لست متأكدا من أن هناك طريقة معتمدة رسميا للقيام بذلك - يبدو أن هذا النوع من الأشياء التي قد تكون مخاطرة أمنية (على الرغم من كن صادقا، لا أستطيع التفكير في كيفية إيقاف تشغيل رأس رأسي). عادة في جافا سكريبت عندما تريد إيقاف التعليمات البرمجية الخاصة بك الجري، أنت فقط return من أي وظيفة يتم تنفيذها. (ال return البيان اختياري إذا كان آخر شيء في الوظيفة، ويجب عدم إرجاع الوظيفة قيمة) إذا كان هناك سبب عودته ليس جيدا بما يكفي بالنسبة لك، فربما يجب عليك تحرير المزيد من التفاصيل في السؤال حول سبب تعكيرك وربما يمكن لشخص ما تقديم حل بديل.

لاحظ أنه في الممارسة العملية، سيتوقف مفسر جافا سكريبت معظم المتصفحات عن تشغيل البرنامج النصي الحالي إذا واجهوا خطأ. حتى تتمكن من القيام بشيء ما في الوصول إلى سمة لمتغير UNSET:

function exit() {
    p.blah();
}

و سوف المحتمل إحباط البرنامج النصي. ولكن يجب أن لا تحسب ذلك لأنه ليس على الإطلاق، ويبدو حقا مثل ممارسة فظيعة.

تعديل: حسنا، ربما لم يكن هذا إجابة جيدة في ضوء ólafur. على الرغم من أن die() وظيفة يرتبط بتنفيذ أساسا الفقرة الثانية، أي أنها تلحي خطأ.

تحديث: هذا يعمل طالما كنت لا catch هو - هي!

throw window.location.assign('dead.html');

تأتي هذه الوظيفة الصغيرة بالقرب من مخرج Mimicking PHP (). كما هو الحال مع الحلول الأخرى، لا تضيف أي شيء آخر.

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit

ما عليك سوى إنشاء حالة من BOOL، لا حاجة لرمز معقد هنا ..

إذا كنت بمجرد تشغيلها إلى True / أو عدة مرات، فسوف يمنحك سطرا واحدا من الحل / وليس بسيطة بشكل أساسي مثل ذلك.

يرمي ""؛

هو إساءة استخدام للمفهوم ولكن ربما الخيار الوحيد. ونعم، سيتعين عليك إعادة تعيين جميع مستمعي الأحداث، تماما مثل الإجابة المقبولة يذكر. تحتاج أيضا إلى نقطة واحدة من الدخول إذا أنا على حق.

في الجزء العلوي منه: تريد صفحة تقاريرها عن طريق البريد الإلكتروني بمجرد رميها - يمكنك استخدامها على سبيل المثال الغراب / الحراسة لهذا. ولكن هذا يعني أن تنتج نفسك ايجابيات كاذبة. في مثل هذه الحالة، تحتاج أيضا إلى تحديث المعالج الافتراضي لتصفية مثل هذه الأحداث أو تعيين هذه الأحداث على تجاهل لوحة معلومات Sentry.

window.stop ()؛

هذا لا يعمل أثناء تحميل الصفحة. توقف عن فك تشفير الصفحة كذلك. لذلك لا يمكنك حقا استخدامها لتقديم مستخدمي المستخدم خالية من جافا سكريبت من صفحتك.

مصحح الأخطاء

توقف التنفيذ فقط مع فتح المصحح. يعمل بشكل رائع ولكن ليس قابل للتسليم.

أعتقد أن هذا السؤال قد تم الرد عليه، انقر هنا للمزيد من المعلومات. فيما يلي الإجابة القصيرة التي يتم نشرها.

throw new Error("Stop script");

يمكنك أيضا استخدام متصفحك لإضافة نقاط استراحة، كل متصفح مشابه، تحقق من المعلومات أدناه لاستعرضك.

للحصول على معلومات استراحة Chrome Information انقر هنا
ل Firefox نقاط استراحة المعلومات انقر هنا
لاستكشاف نقاط استراحة المعلومات انقر
للحصول على معلومات نقاط استراحة Safari انقر هنا

إذا كنت تستخدم أي وظيفة غير محددة في البرنامج النصي، فسوف تتوقف البرنامج النصي بسبب "المرجع غير المعجل". لقد حاولت باتباع الرمز وأول سطرين أعدمين.

أعتقد، هذه هي أفضل طريقة لإيقاف البرنامج النصي. إذا كان هناك أي طريقة أخرى، يرجى التعليق لي. أريد أيضا أن أعرف أفضل وسيلة أخرى وبسيطة. راجع للشغل، لم أحصل على وظيفة مخرج أو تموت في ثناياه عوامة في JavaScript مثل PHP لإنهاء البرنامج النصي. إذا كان أي شخص يعرف بعد ذلك، واسمحوا لي أن أعرف.

alert('Hello');

document.write('Hello User!!!');

die();  //Uncaught ReferenceError: die is not defined

alert('bye');

document.write('Bye User!!!');

هذا مثال على ذلك، إذا كانت الحالة موجودة، فقم بإنهاء البرنامج النصي. يمكنني استخدام هذا في جافا سكريبت جانبي عميل SSE الخاص بي، إذا كان

<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>

كن plot parsed مباشرة من JSON PARSE ...

if( ! SSE_HOST  ) throw new Error(['[!] SSE.js: ERR_NOHOST - finished !']);

... على أي حال الفكرة العامة هي:

if( error==true) throw new Error([ 'You have This error' ,  'At this file', 'At this line'  ]);

هذا سوف ينتهي / يموت النصي الخاص بك javasript

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top