【问题标题】:Chain jQuery AJAX promises with custom ones将 jQuery AJAX 承诺与自定义承诺联系起来
【发布时间】:2015-08-11 15:34:11
【问题描述】:

我有一个特定的网站,我不能像往常一样依赖 HTTP 状态代码来触发 AJAX 调用后的成功或失败。 我遇到的一种解决方法是将响应构建为一个 JSON 对象,该对象具有一个“类型”属性,该属性的值为“成功”或“错误”。

我有一个辅助函数:

function myAjaxCall(data) {
   return $.ajax({method: 'post', url: myUrl, data: data});
}

我想要完成的是让这成为可能:

myAjaxCall(data).then(successFunction, failFunction);

我试图插入这个函数:

function myPromise(response) {
     var d = $.Deferred();
     response.type == 'success' ? d.resolve() : d.reject();
     return d;
}

但我无法想象一种干净的方式将我的承诺插入代码中。

【问题讨论】:

  • 什么是 responseText 对象有 while 函数返回?
  • @Akhil 这里的代码真的很乱,但这暴露了另一个问题:如何将 AJAX 响应传递给我的 promise?

标签: jquery ajax promise jquery-deferred


【解决方案1】:

只需用then链接它:

function myAjaxCall(data) {
    return $.ajax({method: 'post', url: myUrl, data: data}).then(myPromise);
}

您的myPromise 函数将接收响应作为其参数,并且then 确实返回了调用结果的承诺(您返回的承诺)。顺便说一句,您可能应该将响应的某些部分传递给resolve/reject,以便您的successFunctionfailFunction 可以访问它。不知道你的回答到底是什么样子,但作为一个例子:

function myPromise(response) {
     var d = $.Deferred();
     response.type == 'success' ? d.resolve(response.data) : d.reject(response.error);
     return d;
}

【讨论】:

  • 但是如何将响应传递给 myPromise?
  • @Cranio:你没有。当$.ajax 承诺实现时,then 会为您服务。
  • 最后我自己用同样的方法整理出来了,但我认为无论如何你都值得点赞和回答,非常感谢。
【解决方案2】:

var myAjaxCall=function(data) { return $.ajax({method: 'post', url: "myUrl", data: data}); } console.log(myAjaxCall("data").responseText()); }); 请检查您在请求后收到的响应文本。然后将其传递给您想要的任何变量或函数。

【讨论】:

  • 我不认为这是正确的。如果请求是异步的,如何获得 responseText?您应该使用回调。我认为您错过了重点,也错过了链式异步调用的整个概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
相关资源
最近更新 更多