如何在Javascript / Jquery中对失败的ajax请求返回新的promise而不是错误?

时间:2013-10-08 16:43:52

标签: javascript jquery ajax promise jquery-deferred

我有一个创建deferred对象的函数。在fail我正在调用一个后备函数,后者又创建并返回它自己的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);
  });

如果我需要的文档/附件不在localstorage中,我的fetchConfiguration调用会尝试从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调用的结果?如果没有,我将如何构建我的调用,以便我总是向第一个方法调用返回一个承诺?

感谢您的帮助!


谢谢您的帮助!修正如下:

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

1 个答案:

答案 0 :(得分:3)

.fail()总是返回原来的承诺。

您应该使用失败回调来调用then()以允许链接:

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

在jQuery 1.8之前,请改用.pipe()