8

(この質問は実際には言語に限定されていないので、他の言語でも解決策を提出してください。)

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

4

5 に答える 5

37

あなたはそれを簡単に書くことができます:

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

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

深く掘り下げたい場合は、カリー化と部分機能の適用について読むことをお勧めします。これらのトピックは非常に興味深いものです。

于 2009-09-18T17:08:58.743 に答える
14

クロージャなしのさらに別のバージョン:

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);
于 2009-09-18T17:50:51.180 に答える
2

Chaining is rather used to execute multiple methods on one object. So you would rather consider the function as the object and set the timeout there:

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

(function(){alert("Hello World!");}).callAfter(3);
于 2009-09-18T17:22:25.933 に答える
0

OO Javascriptを実行する場合は、はい、メソッドチェーンを実行できます。

人気のあるJavaScriptフレームワークのいくつかはこれを行います。 jQueryは、通常は値を返さない関数のjQueryオブジェクトを返すことでこれを行います。

于 2009-09-18T17:08:59.160 に答える
0

このような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 */}
});

つまり01は入口、出口関数です。他のすべての関数は内部状態を遷移します。すべての関数は引数を取ることができます。opt

新しく作成されたAPIのインスタンスを作成します。

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

そしてそれを呼ぶ

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

(小さな)ソースを見て、これがどのように実装されているかを確認してください。

ps。この回答を使用してドキュメントを更新しました:D

于 2014-07-16T13:01:06.370 に答える