إرسال رسائل إلى الخادم مع المذنب منذ فترة طويلة

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

  •  16-09-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة لإرسال البيانات من العميل إلى الخادم؟

رمز المثال أنا أستخدم من كيف يمكنني تنفيذ "الاقتراع الطويل" الأساسي؟

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

المحلول 3

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

إليك بعض رمز الاقتراع الطويل المعدل من رابطي أعلاه:

var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase();
var startLongpoll = function() {
    $.ajax({
        type:"POST", async:true, cache:false, timeout:0, 
        data: {userid: userid},
        success: function(data){
            _outCallback(data);
            setTimeout( startLongpoll, 10 );
        },
        error: function(xhr, textStatus, errorThrown){
            _errCallback(textStatus+" ("+errorThrown+")");
            setTimeout( startLongpoll, 5000 );
        },
    });
};
setTimeout(startLongpoll,10);

ما يتحدثه Moathe مع قائمة الانتظار هو أن JS لا تضمن أنه سيتم استلام XHRS بالترتيب الذي أرسلته إليهم. لن يتم فقد الرسائل (أو على الأقل لم تكن في اختباراتي)، ولا توجد مشكلة محددة طويلة الاقتراع، ولكن هناك شيء يجب مراعاته عند استخدام XHR لإرساله.

إذن إليك رمز قائمة الانتظار:

var queue = [];
var busy = false;
this.send = function(msg) {
    queue[queue.length] = msg;
    if (busy) return;
    busy=true;
    var s = function() {
        var m = queue.shift();
        $.ajax({
            type:"POST", async:true, cache:false, timeout: 5000,
            data: {userid:userid, msg:m},
            error: function(xhr, textStatus, errorThrown){
                _errCallback(textStatus + " (" + errorThrown + ")");
                if (queue.length>0) s(); else busy = false;
            },
            success: function(){
                if (queue.length>0) s(); else busy = false;
            }
        });
    }
    s();
};

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

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

نصائح أخرى

مجرد استخدام XHR للقيام به وظيفة.

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

إرسال البيانات إلى الخادم هو مجرد طلب قياسي. XHR على ما يرام، أو JSONP، كل ما يطفو القارب الخاص بك.

لا تشعر بالارتباك من قبل الاقتراع الطويل؛ يوجد الاقتراع الطويل فقط كوسيلة لإرسالها من الخادم إلى العميل. إرسال البيانات من العميل إلى الخادم هو ما كان عليه الويب منذ إنشائه، وطلب XHR العادي هو كل ما تحتاجه.

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