سؤال

(هذا السؤال لا يقتصر حقًا على اللغة، لذا لا تتردد في تقديم الحل بلغات أخرى أيضًا.)

كنت أتساءل فقط عما إذا كان من الممكن كتابة شيء كهذا في JavaScript:

// Wait 3 seconds and then say our message in an alert box
wait(3).then(function(){alert("Hello World!");});

حيث ستكون الطريقة التقليدية هي الكتابة

// Wait 3 seconds and then say our message in an alert box
setTimeout(function(){alert("Hello World!");}, 3000);

آسف إذا كان هذا سؤال مستجد :p

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

المحلول

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

function wait(delay) {
  return {
    then: function (callback) {
      setTimeout(callback, delay*1000);
    }
  };
}

wait(3).then(function(){alert("Hello World!");});

إذا كنت تريد أن تذهب في العمق، أنصحك أن تقرأ عن الضمادة و < وأ href = "http://ejohn.org/blog/partial-functions-in-javascript/" يختلط = "noreferrer"> جزئية تطبيق وظيفة أو تلك المواضيع هي مثيرة للاهتمام حقا.

نصائح أخرى

ولكن نسخة أخرى، دون إغلاق:

function wait(seconds) {
    if(this instanceof wait)
        this.delay = seconds;
    else return new wait(seconds);
}

wait.prototype.then = function(callback) {
    setTimeout(callback, this.delay * 1000);
};

ومع بعض مزيد من رموز، يمكنك حتى الدعوة الى وظائف مرارا وتكرارا:

function wait(seconds) {
    if(this instanceof wait)
        this.delay = seconds;
    else return new wait(seconds);
}

wait.prototype.then = function(callback) {
    setTimeout(callback, this.delay * 1000);
    return this;
};

wait.prototype.wait = function(seconds) {
    this.delay += seconds;
    return this;
};

var start = new Date;
function alertTimeDiff() {
    alert((new Date - start)/1000);
}

wait(1).then(alertTimeDiff).wait(3).then(alertTimeDiff);

ويستخدم التقييد بدلا من تنفيذ أساليب متعددة في كائن واحد. لذلك كنت تنظر بدلا من وظيفة ككائن وتعيين المهلة هناك:

Function.prototype.callAfter = function(delay) {
    setTimeout(this, delay*1000);
};

(function(){alert("Hello World!");}).callAfter(3);

إذا كنت لا OO جافا سكريبت، ثم نعم، يمكنك أن تفعل طريقة تسلسل.

وبعض الأطر جافا سكريبت شعبية قيام بذلك. مسج تفعل ذلك عن طريق إعادة الكائن مسج للوظائف التي من شأنها عادة لا ترجع قيمة.

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

// > npm i mu-ffsm # install node dependency
var mkChained = require('mu-ffsm');

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

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

  • دخول :* ⟶ س
  • انتقال :(س⟶*)⟶س
  • مخرج :ق ⟶ (* ⟶ *)

على سبيل المثال

var API = mkChained({
  0:    function(opt)    {return ;/* create initial state */},
  then: function(s, opt) {return s; /* new state */},
  whut: function(s, opt) {return s; /* new state */},
  1:    function(s, opt) {return ;/* compute final value */}
});

لذا 0, 1 هي وظائف الدخول والخروج.جميع الوظائف الأخرى تنتقل إلى حالة داخلية.يمكن لجميع الوظائف أن تأخذ الحجج، على سبيل المثال. opt

نقوم بإنشاء مثيل لواجهة برمجة التطبيقات (API) المصممة حديثًا،

var call = API() // entry
   .whut()       // transition
   .then()       // transition
   .whut();      // transition

ونسميها

var result0 = call() // exit
  , result1 = call() // exit

أنظر إلى (الصغيرة) مصدر لنرى كيف يتم تنفيذ ذلك.

ملاحظة.استخدم هذه الإجابة لتحديث المستندات :D

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