javascript - مميزات - النوم في جافا سكريبت-التأخير بين الإجراءات




مميزات الجافا سكريبت (4)

2018 تحديث

كما يدعم الآن كل من Safari و Firefox و Node.js التزامن / الانتظار / الوعود.

2017 تحديث

لقد تطورت جافا سكريبت منذ طرح هذا السؤال وأصبحت له وظائف المولدات ، ويتم طرح async / await / Promise الجديد. يوجد أدناه حلان ، أحدهما مع وظيفة المولد التي ستعمل على جميع المتصفحات الحديثة ، وآخر ، باستخدام التزامن / الانتظار الجديد الذي لم يتم دعمه بعد في كل مكان.

باستخدام وظيفة المولد:

'use strict';

let myAsync = (g) => (...args) => {
    let f, res = () => f.next(),
        sleep = (ms) => setTimeout(res, ms);
    f = g.apply({sleep}, args); f.next();
};

let myAsyncFunc = myAsync(function*() {
    let {sleep} = this;
    console.log("Sleeping");
    yield sleep(3000);
    console.log("Done");
});

myAsyncFunc();

باستخدام async / await / Promises:

(بدءًا من 1/2017 ، مدعوم على Chrome ، ولكن ليس على Safari و Internet Explorer و Firefox و Node.js)

'use strict';

function sleep(ms) {
  return new Promise(res => setTimeout(res, ms));
}

let myAsyncFunc = async function() {
  console.log('Sleeping');
  await sleep(3000);
  console.log('Done');
}

myAsyncFunc();

انتبه إلى حقيقة أن هذين الحلين غير متزامنين في طبيعتهما. هذا يعني أن myAsyncFunc (في كلتا الحالتين) سيعود أثناء النوم.

من المهم ملاحظة أن هذا السؤال مختلف عن ما هو إصدار JavaScript من sleep ()؟ حيث يطلب مقدم الطلب نومًا حقيقيًا (لا يوجد تنفيذ آخر للشفرة على العملية) بدلاً من التأخير بين الإجراءات.

هل هناك طريقة يمكنني القيام بها في جافا سكريبت قبل القيام بعمل آخر؟

مثال:

 var a = 1+3;
 // Sleep 3 seconds before the next action here
 var b = a + 4;

إذا كنت تريد وظائف أقل ثقة من setTimeout و setInterval ، يمكنك لفها في الوظائف التي تعكس ترتيب الوسيطات فقط ومنحهم أسماء جميلة:

function after(ms, fn){ setTimeout(fn, ms); }
function every(ms, fn){ setInterval(fn, ms); }

إصدارات CoffeeScript:

after = (ms, fn)-> setTimeout fn, ms
every = (ms, fn)-> setInterval fn, ms

يمكنك بعد ذلك استخدامها بشكل رائع مع وظائف مجهولة:

after(1000, function(){
    console.log("it's been a second");
    after(1000, function(){
        console.log("it's been another second");
    });
});

الآن يقرأ بسهولة كما يلي "بعد مللي ثانية N، ..." (أو "كل N مللي ثانية ، ...")


في حال كنت حقا بحاجة sleep() فقط لاختبار شيء ما. ولكن اعلم أنه سيعطل المتصفح في معظم الأوقات أثناء تصحيح الأخطاء - ربما هذا هو سبب احتياجك إليه على أي حال. في وضع الإنتاج سأعلق هذه الوظيفة.

function pauseBrowser(millis) {
    var date = Date.now();
    var curDate = null;
    do {
        curDate = Date.now();
    } while (curDate-date < millis);
}

لا تستخدم تاريخًا new Date() في الحلقة ، إلا إذا كنت ترغب في إضاعة الذاكرة ومعالجة الطاقة والبطارية وربما العمر الافتراضي لجهازك.


هنالك العديد من الطرق لحل هذه المشكلة. إذا استخدمنا وظيفة setTimeout ، دعنا نتعرف عليها أولاً. تحتوي هذه الوظيفة على ثلاثة معلمات: function أو code ، delay (بالمللي ثانية) parameters . نظرًا لأن الدالة أو معلمة الرمز مطلوبة ، يكون الآخران اختياريًا. بمجرد عدم إدخال التأخير ، سيتم تعيينه على صفر.

لمزيد من التفاصيل حول setTimeout() انتقل إلى هذا الارتباط .

نسخة مبسطة:

var a = 1 + 3;
var b;
console.log('a = ' + a);
setTimeout(function(){ 
    b = a + 4; 
    console.log('b = ' + b);
}, 1000);

انتاج:
أ = 4
24 -> معرف الرقم من قائمة المهلات النشطة
ب = 8


باستخدام تمرير المعلمة:

var a = 1 + 3;
var b;
console.log('a = ' + a);
setTimeout(myFunction, 1000, a);

function myFunction(a)
{
    var b = a + 4;
    console.log('b = ' + b);
}

انتاج:
أ = 4
25 -> معرف الرقم من قائمة المهلات النشطة
ب = 8



دعم المتصفح:

Chrome     Firefox     Edge     Safari     Opera
1.0        1.0         4.0      1.0        4.0




sleep