web-dev-qa-db-ja.com

jQuery.Deferred()。then、複数のパラメーターで解決する方法

したがって、私のAPIは、特定の遅延が解決されると、2つのパラメーターを取得することを想定しています。

_fn().done(function(arg1, arg2) {
  console.log(arg1, arg2);
}).fail(function(err) {
  console.error(err);
});
_

上記のfn関数に関連して、解決する前に、他の遅延が戻るのを最初に待つ必要があります。

_function other() {
  // stubbed out to always resolve
  return $.Deferred().resolve().promise();
}

function fn() {
  return other().then(function() {
    return [1, 2];
  });
}
_

ただし、_arg1_は_[1, 2]_になり、_arg2_はundefinedになるため、これは機能しません。 Deferred.then()の最初の成功フィルター関数の引数から何かを返す方法がわからないため、結果のパイプされた遅延は複数の引数で解決されます。

もちろん、私はこれを行うことができます:

_function fn() {
  var done = $.Deferred();
  other().done(function(){
    done.resolve(1, 2);
  }).fail(function(){
    done.reject.apply(done, arguments);
  });
  return done.promise();
}
_

しかし、それは.then()を使用するほどエレガントではなく、拒否された状態を単にパイプ処理しているだけであることがわかっていても、毎回負の障害ケースAPIについて心配する必要があります。

はい、fn() apiを変更して配列で解決することもできますが、これに対する洗練された解決策があることを本当に望んでいます。

12
codefactor

複数の引数を渡すには、resolve()またはreject()を呼び出す必要があります。

.then()には、返されたコレクションを「spreading」するためのメカニズムは含まれていません。最初の引数として、コレクションをそのまま保持します。

ただし、返されるDeferredまたはpromiseと相互作用します。 "で始まる段落jQuery 1.8"以降

これらのフィルター関数は、promiseの.done()または.fail()コールバックに渡される新しい値を返すか、別の監視可能なオブジェクト(Deferred、Promiseなど)を返すことができます。解決済み/拒否済みのステータスと値をpromiseのコールバックに渡します

したがって、other()の例をfn()の基礎として使用して、別のDeferred()とかなり簡潔に保つことができます。

function fn() {
    return other().then(function () {
        return $.Deferred().resolve(1, 2).promise();
    });
}

fn().then(function (a, b) {
    console.log(arguments.length, a, b); // 2 1 2
});

http://jsfiddle.net/cqac2/

17

に渡されたコールバックは、次のような2つの引数を持つ新しい$ .Deferredを返すことができます。

function other() {
  // stubbed out to always resolve
  return $.Deferred().resolve().promise();
}

function fn() {
  return other().then(function() {
    return $.Deferred().resolve(1, 2).promise();
  });
}
0
PHP Guru