1

オブジェクトを作成する関数がありdeferredます。Onfailでは、フォールバック関数を呼び出しています。これは、独自のdeferred/promiseオブジェクトを作成して返します。このフォールバックの結果を返したいのですが、最初の呼び出しでdeferredしか返すことができません。error

これが私がやっていることです:

 // method call
 init.fetchConfigurationFile(
      storage,
      "gadgets",
      gadget.getAttribute("data-gadget-id"),
      pointer
  ).then(function(fragment) {
      console.log("gotcha");
      console.log(fragment);
  }).fail(function(error_should_be_fragment) {
      console.log("gotcha not");
      console.log(error_should_be_fragment);
  });

私のfetchConfiguration呼び出しは localstorage からロードしようとし、必要なドキュメント/添付ファイルが localstorage にない場合はファイルからのロードにフォールバックします。

  init.fetchConfigurationFile = function (storage, file, attachment, run) {
    return storage.getAttachment({"_id": file, "_attachment": attachment})
      .then(function (response) {
        return jIO.util.readBlobAsText(response.data);
      })
      .then(function (answer) {
        return run(JSON.parse(answer.target.result))
      })
      .fail(function (error) {
        // PROBLEM
        console.log(error);
        if (error.status === 404 && error.id === file) {
          return init.getFromDisk(storage, file, attachment, run);
        }
      });
  };

私の問題は、問題なくキャッチできることですが404、オブジェクトを返す代わりに、errorによって生成されたプロミスを返したいinit.getFromDiskです。

質問:エラー ハンドラで呼び出し
の結果を返すことはできますか? getFromDiskそうでない場合、最初のメソッド呼び出しに常に promise を返すように、どのように呼び出しを構成する必要がありますか?

手伝ってくれてありがとう!

解決策:
助けてくれてありがとう! 次のように修正しました。

 init.fetchConfigurationFile(
      storage,
      "gadgets",
      gadget.getAttribute("data-gadget-id"),
      pointer
    ).always(function(fragment) {
      console.log("gotcha");
      console.log(fragment);
    });

init.fetchConfigurationFile = function (storage, file, attachment, run) {
  return storage.getAttachment({"_id": file, "_attachment": attachment})
    .then(function (response) {
      return jIO.util.readBlobAsText(response.data);
    })
    .then(
      function (answer) {
        return run(JSON.parse(answer.target.result));
      },
      function (error) {
        if (error.status === 404 && error.id === file) {
          return init.getFromDisk(storage, file, attachment, run);
        }
      }
    );
};
4

1 に答える 1

3

.fail()常に元の promise を返します。

then()チェーンを許可するには、失敗のコールバックで呼び出す必要があります。

.then(undefined, function(error) {
    return ...;
});

jQuery 1.8 より前では、.pipe()代わりに使用してください。

于 2013-10-08T16:48:58.453 に答える