我正在开发FutureJS,它最初基于Crockford 的承诺(原始幻灯片)。当前的目标是成为 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
- 当返回一个承诺时,链中的下一个方法将不会执行,直到承诺被履行
- 当返回一个“文字对象”时,链中的下一个方法将使用该对象
- 当返回
undefined
(或不返回任何东西)时,链中的下一个方法将使用定义的对象
context
-d 对每个提供者apply()
和消费者,从而成为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
而不是chain
因为 _.js 已经有一个命名的方法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);