Javascript “链多”;然后";在jQuery.when中
我有一个函数,它的作用如下:Javascript “链多”;然后";在jQuery.when中,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我有一个函数,它的作用如下: function do_something() { // some code return $.when(foo, bar, baz).then(do_something_else); } function do_something_else(_foo, _bar, _baz) { // do something else return /* the original inputs */; } 因此,当有人使用do\u som
function do_something() {
// some code
return $.when(foo, bar, baz).then(do_something_else);
}
function do_something_else(_foo, _bar, _baz) {
// do something else
return /* the original inputs */;
}
因此,当有人使用do\u something
时,他们还可以链接更多回调,如:
do_something().then(function(_foo_2, _bar_2, _baz_2) {
console.log(_foo_2, _bar_2, _baz_2);
});
问题是,我不知道如何绕过从do\u something\u other
到所述匿名函数的原始返回。我不想收到一个列表,而是位置参数,所以“when foo”插入一些值来做其他的事情,然后相同的值会传递给\u foo\u 2
如何在JS中执行此操作?使用
中的匿名函数。然后
并传递要传递的参数。我将用.done
替换.then
,因为在这种情况下,您不需要.then
function do_something() {
// some code
return $.when(foo, bar, baz).done(function(_foo_2, _bar_2, _baz_2){
do_something_else.apply(this,_foo_2);
});
}
。然后实际创建一个新的延迟对象并将其发送到链。由于没有从返回任何内容,因此新的延迟对象没有参数。请参见此示例:
$.when($.Deferred().resolve(2), $.Deferred().resolve(4))
.then(function(a,b) {
console.log(a,b); // 2,4
return $.Deferred().resolve(a,b,6);
}).then(function(a,b,c) {
console.log(a,b,c); // 2,4,6
});
如果您只是使用.done
,它将按预期工作
$.when($.Deferred().resolve(2), $.Deferred().resolve(4))
.done(function(a,b) {
console.log(a,b);
}).done(function(a,b) {
console.log(a,b);
});
最常用的用法是链接ajax请求:
$.ajax({...}).then(function(){
return $.ajax({...});
}).then(function(){
return $.ajax({...});
}).then(function(){
return $.ajax({...});
}).then(function(){
return $.ajax({...});
});
这也可以在循环中轻松完成。每个。然后
将有权访问上一个请求返回的数据。在这种情况下,.done和.then之间有什么区别?我正在运行。然后
将创建一个新的延迟,并将其添加到链中。您在链上做的下一件事,例如.done
或.then
,将只能访问上一个返回的内容。然后@KevinB:jQuery就是这样实现的吗?悲哀的:(在最初的提案中,如果没有返回任何结果,则新的承诺将以原始结果解决。
回调。@FelixKling这也是我最初认为的,但进一步的测试表明情况并非如此。我对此有点困惑。@FelixKling在进一步阅读后,我看到了困惑所在。函数您所指的可选性是在1.5中添加的,在1.8中删除的,当时。然后
接管了。管道
的功能。然后的参数现在完成并使筛选器失败,而不是回调。