سؤال

وكل 3 ثوان أقوم بإجراء طلب AJAX POST إلى الحصول على حالة عملية. هذا وتعمل كبرى.

وعندما تصل عملية 100٪ مكالمة هاتفية تنفيذ وظيفة (مبين أدناه) لإضافة عناصر جديدة إلى صفحة ومن ثم فإنه يلغي أسلوب setTimeout التي تستخدم بشكل مستمر على التقدم كل 3 ثوان. ومع ذلك، لقد قيل لي من قبل المستخدمين لي أنه فشل في بعض الأحيان إلى إلغاء ولا يتم إضافة عناصر جديدة إلى صفحة ولقد كنت أنها تتعثر في إظهار "100٪".

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

ولقد علق رمز، اعتذارها لفترة طويلة جدا. لقد حاولت للحد منه.

function convertNow(validURL){

    startTime = setTimeout('getStatus();', 6000); 
       //AJAX CALL TO RUN PROCESS
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){
       //ON SUCCESS CLEAR SETTIMEOUT AND SHOW ELEMENTS (text)
       clearTimeout(continueTime);
       clearTimeout(startTime);    
        $("#loading").hide("slow");
        $("#done").html("Done");   
       }//function

     });//ajax

}//function convertNow

function getStatus(){
        //AJAX CALL TO GET STATUS OF PROCESS
        $.ajax({
        type: "POST",
        url: "fileReader.php",
        data: 'textFile=' + fileNameTxt,
        success: function(respomse){
        textFileResponse = respomse.split(" ");
        $("#done").html("Processing...");
        }
        });//ajax
        clearTimeout(continueTime);

        if(textFileResponse[0]=='100.0%'){
            clearTimeout(continueTime);
        }
        else{
            clearTimeout(startTime);
            continueTime = setTimeout('getStatus();', 3000); 
        }
}
هل كانت مفيدة؟

المحلول

وهناك ربما خطأ تحليل في textFileReponse [0] == '100.0٪' في بعض الحالات الحافة، مع القيمة في الرد لا تساوي بالضبط 100.0٪ (ربما هناك بيضاء إضافية، أو ربما هناك بعض الاختلافات الطفيفة في بعض المنابر، الخ ...). وهذا من شأنه أن يسبب رمز للسقوط من خلال لكتلة آخر {}، وسوف تكون قائمة الانتظار وظيفة getStatus الخاص بك مرة أخرى.

وتحرير: ونظرا للموضوع في التعليقات، كما انها ليكيليهود المساواة أن هناك حالة سباق يجري بين الكتل اثنين من التعليمات البرمجية اياكس. (مجرد وضع هذا هنا لصالح القراء). END تحرير

وماذا أنت ربما تريد، بالإضافة إلى حل إعراب، ومع ذلك، هو استخدام setInterval ()، مع جهاز توقيت واحد فقط، بدلا من توقيت STARTTIME وcontinueTime. setTimeout ينفذ مرة واحدة فقط، في حين setInterval يكرر كل س ميلي ثانية، لذلك كنت في حاجة واحدة فقط. لإلغاء setInterval، استخدم clearInterval.

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