我一直在阅读jQuery延迟和承诺,我看不出使用.then()&.done()成功回调之间的区别.我知道Eric Hynds提到.done()并.success()映射到相同的功能,但我猜是这样做的,.then()因为所有的回调都是在成功操作完成时调用的.
任何人都可以请你告诉我正确的用法?
jQuery Deferred有两个函数可用于实现函数的异步链接:
then()
deferred.then( doneCallbacks, failCallbacks ) Returns: DeferreddoneCallbacks解析Deferred时调用的函数或函数数组.
failCallbacks拒绝延迟时调用的函数或函数数组.
pipe()
deferred.pipe( [doneFilter] [, failFilter] ) Returns: PromisedoneFilter解析Deferred时调用的可选函数.
failFilter拒绝Deferred时调用的可选函数.
我知道then()已经存在了一段时间,pipe()因此后者必须增加一些额外的好处,但正是这种差异恰恰在于我.两者都采用了几乎相同的回调参数,尽管它们的名称不同,返回a Deferred和返回a 之间的区别Promise似乎很小.
我已经一遍又一遍地阅读官方文档,但总是发现它们太"密集"而无法真正地包围我的搜索已经找到了很多关于这个或另一个特征的讨论,但我没有发现任何真正澄清不同的东西每个人的利弊.
那么什么时候使用then它更好,pipe什么时候使用更好?
Felix的出色答案确实有助于阐明这两个功能的区别.但我想知道是否有时候功能性then()比那更好pipe().
很明显,它pipe()比then()以前更强大,似乎前者可以做后者可以做的任何事情.使用的一个原因then()可能是它的名称反映了它作为处理相同数据的一系列函数的终止的作用.
但是有一个用例需要then()返回由于它返回一个新的而Deferred无法完成的原始文件吗?pipe()Promise
jquery asynchronous decoupling jquery-chaining jquery-deferred
我已经探索了一下jQuery的递延/无极API和我对之间的差异非常困惑pipe()和then()哲学和jQuery的文档.我发现从jQuery 1.8开始,pipe()只是then()的别名.
来自jQuery源码:
// Keep pipe for back-compat
promise.pipe = promise.then;
Run Code Online (Sandbox Code Playgroud)
然而,文档完全不同pipe(),then()因为它们被认为具有完全不同的用途.
说明then():
描述:添加在解析或拒绝Deferred对象时要调用的处理程序.
说明pipe():
描述:过滤和/或链接延迟的实用方法.
据我所知,从历史上看,它们的行为略有不同,但在管道文档或当时的文档中,它甚至没有说这两个函数现在完全相同.
所以,这是我的两部分问题:
pipe()和then()不同之处?then()返回一个新的延迟对象?这种行为完全没有记录(文档只是说它返回Deferred,而不是它是一个新的).我知道这样做有用(即实现所有pipe()的功能),但从哲学上讲,为什么会这样呢?鉴于then()(附加处理程序)的描述,这是不必要的.更新
我甚至会说这些then()文档具有误导性和不准确性:
由于deferred.then 返回延迟对象,因此延迟对象的其他方法可以链接到此方法,包括其他.then()方法.
也许它只是模糊,但它意味着它返回你then()为链接调用的延迟对象,而实际上它返回一个全新的对象....
再次更新
似乎文档完全错误/过时了!所以这就解释了为什么文档没有提到它们是同一个东西.但是,我的第二个问题仍然存在.原因then()是简单地返回一个新的延迟,以便它pipe()可以变得等效吗?
我试图理解以下zip函数(尤其是调用函数)如何变得更加实用.我得到的问题是,invoke方法必须等待左侧和右侧都可以在它调度值之前填充.必须按顺序调用这些值,以便压缩正确的值,否则我会考虑使用curry/partial函数来实现此目的.
有什么我可以使用可以消除这种阻碍.
function zip(state, a, b) {
var left = [];
var right = [];
function invoke() {
if (left.length > 0 && right.length > 0) {
state([left.shift(), right.shift()]);
}
}
a.foreach(function(v) {
left.push(v);
invoke();
});
b.foreach(function(v) {
right.push(v);
invoke();
});
}
Run Code Online (Sandbox Code Playgroud)
Bellow是满足zip功能的简单例子.
function Stream() {
var env = this;
env.subs = [];
env.id = setInterval(function() {
env.subs.forEach(function(f) {
f(Math.random());
});
}, ((Math.random() * 100) + 500) | 0);
}
Stream.prototype.foreach = function(f) {
this.subs.push(f);
}
zip(function(v) {
console.log(v);
}, …Run Code Online (Sandbox Code Playgroud)