私は、もともとCrockford の約束(元のスライド)に基づいていたFutureJSを開発しています。現在の目標は、JavaScript の非同期ツールボックスになり、チェーンの乱雑さをなくすことです。
Futures.chainify(プロバイダー、コンシューマー、コンテキスト、パラメーター)
非同期メソッド キューイングを使用すると、すぐに利用できる場合とそうでない場合があるデータに対して一連のアクションを実行できます。これが、Twitter の @Anywhere API のしくみです。
この方法でデータをリモートでフェッチするモデルが必要になる場合があります。
Contacts.all(params).randomize().limit(10).display();
Contacts.one(id, params).display();
次のように実装できます。
var Contacts = Futures.chainify({
// Providers must be promisables
all: function(params) {
var p = Futures.promise();
$.ajaxSetup({ error: p.smash });
$.getJSON('http://graph.facebook.com/me/friends', params, p.fulfill);
$.ajaxSetup({ error: undefined });
return p.passable();
},
one: function(id, params) {
var p = Futures.promise();
$.ajaxSetup({ error: p.smash });
$.getJSON('http://graph.facebook.com/' + id, params, p.fulfill);
$.ajaxSetup({ error: undefined });
return p.passable();
}
},{
// Consumers will be called in synchronous order
// with the `lastResult` of the previous provider or consumer.
// They should return either lastResult or a promise
randomize: function(data, params) {
data.sort(function(){ return Math.round(Math.random())-0.5); // Underscore.js
return Futures.promise(data); // Promise rename to `immediate`
},
limit: function(data, n, params) {
data = data.first(n);
return Futures.promise(data);
},
display: function(data, params) {
$('#friend-area').render(directive, data); // jQuery+PURE
// always return the data, even if you don't modify it!
// otherwise your results could be unexpected
return data;
}
});
知っておくべきこと:
providers
- データを返すpromisables
consumers
- データを使用または変更する関数
- 最初の引数は
data
- Promisable を返す場合、チェーン内の次のメソッドは Promise が満たされるまで実行されません。
- 「リテラルオブジェクト」を返すとき、チェーンの次のメソッドはそのオブジェクトを使用します
- 返す
undefined
(または何も返さない) 場合、チェーン内の次のメソッドは定義されたオブジェクトを使用します
context
-apply()
各プロバイダーとコンシューマーに d を送信し、this
オブジェクトになる
params
- 将来の使用のために予約
別の方法として、同期コールバック チェーンを使用することもできます。これは、別の場所で chain().next() または then() として見られたものです。
Futures.sequence(function(callback) {
$.getJSON("http://example.com", {}, callback);
}).then(function(callback, result, i, arr) {
var data = transform_result(result);
$.getJSON("http://example.com", data, callback);
}).then(...)
sequence
_.jschain
には既に名前の付いたメソッドがchain
あり、ライブラリにも _.methodName を使用したいので、名前を付けました。
のぞいて、あなたの考えを教えてください。
FuturesJS は、jQuery、Dojo などと一緒に問題なく動作します。依存関係はありません。Node.js (および env.js を使用する場合は Rhino) で動作します。
=8^D
PS ORM/MVC の修正に関しては、JavaScriptMVCとSproutCoreを確認できます。TriforceJS という独自のソリューションにも取り組んでいますが、まだリリースできるものはありません。
PPSの例promisables
var doStuff = function (httpResult) {
// do stuff
},
doMoreStuff = function (httpResult) {
// do more stuff
};
function fetchRemoteData(params) {
var promise = Futures.promise();
$.getJSON("www.example.com", params, promise.fulfill, 'jsonp');
return promise;
}
p = fetchRemoteData(params);
p.when(doStuff);
p.when(doMoreStuff);