我想请你阅读@kriskowal的优秀文章“A General Theory of Reactivity”。在其中,他使用Q约定提供了以下Promises队列的实现:
function PromiseQueue() {
var ends = Promise.defer();
this.put = function (value) {
var next = Promise.defer();
ends.resolve({
head: value,
tail: next.promise
});
ends.resolve = next.resolve;
};
this.get = function () {
var result = ends.promise.get("head");
ends.promise = ends.promise.get("tail");
return result;
};
}
您会看到它正在使用defer
和get
等Q功能。我正试图将我的前提包括在如何使用本地承诺,但我正在经历大规模的大脑冻结。 (在处理此问题的过程中,我还发现Chrome似乎提供了Promise.defer
方法,AFAIK不在规范中。)
有人可以帮忙吗?
答案 0 :(得分:2)
哦,哇,很酷的人实际上在读gtor:D
在ES6承诺中,.defer
的替换是promise构造函数:
this.put = function (value) {
var r;
var p = new Promise(function(resolve){ r = resolve; });
ends.resolve({
head: value,
tail: p
});
ends.resolve = r;
};
而且.get('foo')
只是.then(function(val){ return val['foo']; })
的语法糖,因此可以直接翻译:
this.get = function () {
var result = ends.promise.then(function(v){ return v["head"]; });
ends.promise = ends.promise.then(function(v){ return v["tail"]; });
return result;
};
同样,由于你没有ends
,你将它与promise构造函数一起映射 - 你总是可以这样做:
var o = {};
var p = new Promise(function(res, rej){ o.res = res; o.rej = rej; });
o.promise = p;
// o is now a deferred
请注意,Kris的队列主要用于说明目的并解释这个概念 - 我个人从来没有真正将它用于任何实际的事情。它的用例场景非常微妙,通常如果你想对你只使用.then
的承诺进行排队。