Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “链多”;然后";在jQuery.when中_Javascript_Jquery_Jquery Deferred - Fatal编程技术网

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中删除的,当时
。然后
接管了
。管道
的功能。然后的参数现在完成并使筛选器失败,而不是回调。