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問題は、説明されている無名関数への元のリターンをバイパスする方法がわからないことです。リストではなく位置引数を受け取りたいので、"when 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);
});

の最も一般的な用途は、.thenajax リクエストの連鎖です。

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

これはループでも簡単に実行できます。それぞれ.thenが、前のリクエストから返されたデータにアクセスできます。

于 2013-06-20T14:37:59.137 に答える