JavaScript-Methode Verkettungs Herausforderung
-
22-07-2019 - |
Frage
(Diese Frage ist wirklich nicht auf die Sprache beschränkt, so wenden Sie sich bitte Lösung in anderen Sprachen zu verfassen.)
Ich habe mich nur gefragt, ob es möglich sei, so etwas in JavaScript zu schreiben:
// Wait 3 seconds and then say our message in an alert box
wait(3).then(function(){alert("Hello World!");});
Wo die traditionelle Art und Weise zu schreiben wäre
// Wait 3 seconds and then say our message in an alert box
setTimeout(function(){alert("Hello World!");}, 3000);
Sorry, wenn dies ist eine noob Frage: p
Lösung
Sie können schreiben einfach:
function wait(delay) {
return {
then: function (callback) {
setTimeout(callback, delay*1000);
}
};
}
wait(3).then(function(){alert("Hello World!");});
Wenn Sie in tief gehen wollen, empfehle ich Ihnen über currying und
Andere Tipps
Noch eine andere Version, ohne Verschluss:
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);
};
Mit etwas mehr Code, können Sie auch die Funktionen wiederholt aufrufen:
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);
Chaining wird eher verwendet, um mehrere Methoden auf einem Objekt auszuführen. So würden Sie eher die Funktion als Objekt betrachten und das Timeout gibt:
Function.prototype.callAfter = function(delay) {
setTimeout(this, delay*1000);
};
(function(){alert("Hello World!");}).callAfter(3);
Wenn Sie das tun OO Javascript, dann ja, können Sie Methode Verkettungs tun.
Einige der beliebtesten JavaScript-Frameworks tun. jQuery tut dies, indem das jQuery-Objekt für Funktionen zurückkehren, die in der Regel keinen Wert zurückgeben würde.
Ich schrieb einen rel="nofollow"> APIs wie dies in einer etwas konsistenter Weise zu schaffen, vielleicht haben Sie es mögen.
// > npm i mu-ffsm # install node dependency
var mkChained = require('mu-ffsm');
Die Idee ist, dass Sie durch den Aufruf eine Entry-Funktion für einen reibungslosen Builder mit einem gewissen Anfangszustand des Typ S
konstruieren. Dann wird jede verkettete Anrufübergänge den Zustand in einen neuen Zustand.
Der Wert, den Sie von Verkettungs ein paar Anrufe bekommen kann als eine Funktion ausgeführt werden, der Ausgang ruft einen Wert aus diesem Zustand zu konstruieren und alle Optionen, die Sie weitergeben.
- Eintrag: * ⟶ S
- Übergang: (S ⟶ *) ⟶ S
- Ausfahrt: S ⟶ (* ⟶ *)
Zum Beispiel
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 */}
});
So 0
, 1
sind Ein-, Aus- Funktionen. Alle anderen Funktionen Übergang ein interner Zustand.
Alle Funktionen können Argumente übernehmen, zum Beispiel. opt
Wir schaffen eine Instanz unserer neu gestalteten API
var call = API() // entry
.whut() // transition
.then() // transition
.whut(); // transition
Und nennen es
var result0 = call() // exit
, result1 = call() // exit
Haben Sie einen Blick auf die (kleine) Quelle zu sehen, wie diese umgesetzt wird.
ps. Verwendet diese Antwort docs zu aktualisieren: D