JavaScriptの方法はチェーンに挑戦
-
22-07-2019 - |
質問
(この問題によって制限される言語のいるので是非ご利用ください提出液その他の言語です。)
どうしてそうなっちゃうんですか迷っていることができるのもこのような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(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);
連鎖は、1つのオブジェクトで複数のメソッドを実行するために使用されます。そのため、関数をオブジェクトと見なし、そこでタイムアウトを設定します。
Function.prototype.callAfter = function(delay) {
setTimeout(this, delay*1000);
};
(function(){alert("Hello World!");}).callAfter(3);
OO Javascriptを実行する場合、はい、メソッドチェーンを実行できます。
人気のあるJavaScriptフレームワークの一部はこれを行います。 jQuery は、通常値を返さない関数のjQueryオブジェクトを返すことでこれを行います。
やや一貫した方法でこのようなAPIを作成するために小さなヘルパーを作成しました。多分あなたはそれが好きです。
// > npm i mu-ffsm # install node dependency
var mkChained = require('mu-ffsm');
アイデアは、エントリ関数を呼び出すことで、タイプ S
の初期状態で流れるようなビルダーを構築することです。その後、各連鎖呼び出しは状態を新しい状態に移行します。
一連の呼び出しをチェーン化して得られる値は、exitを呼び出してその状態と渡すオプションから値を構築する関数として実行できます。
- エントリ:*⟶ S
- 移行:(S⟶ *)⟶ S
- exit: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
(小さな)ソースをご覧くださいで、これがどのように実装されているかを確認します。
ps。この回答を使用してドキュメントを更新しました:D