我在发展
FutureJS
最初是基于
Crockford's promises
(
original slides
)当前的目标是成为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时,链中的下一个方法将不执行,直到实现了承诺
-
当返回“literal object”时,链中的下一个方法将使用该对象
-
回来的时候
undefined
(或不返回任何内容)链中的下一个方法将使用定义的对象
-
context
-
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已经有一个名为
链
我还想为我的库使用methodname。
Take a peek
和
let me know what you think
.
futuresjs将与jquery、dojo等一起工作,没有问题。没有依赖关系。它将使用node.js(使用env.js时使用rhino)。
=8
关于orm/mvc的修复,请注意
JavaScriptMVC
和
SproutCore
. 我也在研究我自己的解决方案triforcejs,但我还没有准备好发布任何东西。
P.P.S.示例
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);