想象一下,我有X
,Y
和Z
个函数,都返回了承诺并准备链接。我想要做的是在完成后通知进度并处理错误。什么是更好的写作和为什么(后果是什么):
一个。
function my_func(index, size){
return X
.then(Y)
.then(Z)
.then(
function(data){
var dfd = new $.Deferred();
dfd.notify("progress", index / size, 'OK');
dfd.resolve(data);
return dfd.promise();
},
function(){
return handleError(arguments, size, index);
}
);
}
或
乙
function my_func(index, size){
var dfd = new $.Deferred();
X
.then(Y)
.then(Z)
.then(
function(data){
dfd.notify("progress", index / size, 'OK');
dfd.resolve(data);
},
function(){
return handleError(arguments, size, index);
}
)
return dfd.promise();
}
另外,有什么区别:
X.then(Y).then(Z);
和
$.when(X).then(Y).than(Z);
如果$.when
部分是不必要的,为什么它在jQuery中存在呢?
答案 0 :(得分:0)
后者是不必要的。这只是额外的瑕疵。 $.when
对于将值转换为promise和聚合非常有用。
这是一个平均$.when
用例:
$.when($.get(...),$.get(...)).then(function(firstResult,secondResult){
// access both results here
});
您可以在此处使用这两个结果,两者都已完成。
关于第一个问题 - 基本上B.第一个选项是deferred anti pattern,最好避免使用。请参阅link to it有关原因的问题。
答案 1 :(得分:0)
主要区别在于您依靠X
成为具有方法then
的对象。
将非延迟/承诺对象传递给$.when
会将其视为已解决的Deferred
,我个人更喜欢这样做,因为它会使函数之间的耦合更松散。