Вызов метода JavaScript - PullRequest
       9

Вызов метода JavaScript

8 голосов
/ 18 сентября 2009

(Этот вопрос на самом деле не ограничен языком, поэтому, пожалуйста, не стесняйтесь отправлять решение и на других языках.)

Мне было просто интересно, можно ли написать что-то подобное на 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

Ответы [ 5 ]

37 голосов
/ 18 сентября 2009

Вы можете написать это легко:

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

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

Если вы хотите углубиться, я рекомендую вам прочитать о curry и приложении с частичными функциями , эти темы действительно интересны.

14 голосов
/ 18 сентября 2009

Еще одна версия, без закрытия:

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);
2 голосов
/ 18 сентября 2009

Цепочка используется для выполнения нескольких методов на одном объекте. Таким образом, вы бы предпочли рассматривать функцию как объект и установить время ожидания там:

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

(function(){alert("Hello World!");}).callAfter(3);
0 голосов
/ 16 июля 2014

Я только что написал маленького помощника для создания подобных API-интерфейсов в несколько последовательной форме, возможно, вам это понравится.

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

Идея состоит в том, что вы создаете свободный конструктор с некоторым начальным состоянием типа S, вызывая функцию ввода. Затем каждый цепочечный вызов переводит состояние в новое состояние.

Значение, которое вы получаете при объединении в цепочку вызовов, может быть выполнено как функция, которая вызывает exit для создания значения из этого состояния и любых передаваемых вами опций.

  • запись: * ⟶ S
  • переход: (S ⟶ *) ⟶ S
  • выход: 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

0 голосов
/ 18 сентября 2009

Если вы используете OO Javascript, тогда да, вы можете делать цепочку методов.

Некоторые из популярных платформ JavaScript делают это. jQuery делает это, возвращая объект jQuery для функций, которые обычно не возвращают значение.

...