34

我有一个功能可以做这样的事情:

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_something,他们还可以链接更多回调,例如:

do_something().then(function(_foo_2, _bar_2, _baz_2) {
    console.log(_foo_2, _bar_2, _baz_2);
});

问题是我不知道如何绕过对do_something_else所描述的匿名函数的原始返回。我不想接收列表,而是位置参数,因此“当 foo”向 do_something_else 的 _foo 插入一些值,然后将相同的值传递给 _foo_2。

我怎样才能在JS中做到这一点?

4

1 回答 1

67

在内部使用匿名函数.then并传递您要传递的参数。我正在替换.then,因为在这种情况下.done您不需要。.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);
    });
}

.then 实际上创建了一个新的延迟对象并将其发送到链。由于您没有从 中返回任何内容.then,因此新的延迟对象没有参数。看这个例子:

$.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);
});

最常见的用途.then是链接 ajax 请求:

$.ajax({...}).then(function(){
    return $.ajax({...});
}).then(function(){
    return $.ajax({...});
}).then(function(){
    return $.ajax({...});
}).then(function(){
    return $.ajax({...});
});

这也可以在循环中轻松完成。每个.then人都可以访问上一个请求返回的数据。

于 2013-06-20T14:37:59.137 回答