当前位置: 首页 > 面试题库 >

带有ES6 Promise的jQuery ajax

梁成双
2023-03-14
问题内容

我试图使用ES6 Promise通过jQuery发出发布请求:

我有一个功能:

getPostPromise(something, anotherthing) {
  return new Promise(function(resolve, reject) {
    $.ajax({
      url: someURL,
      type: 'post',
      contentType: 'application/json; charset=utf-8',
      data: JSON.stringify(
        something: something,
        anotherthing: anotherthing
      }),
      dataType: 'json',
      success: resolve,
      error: reject
    });
  });
}

我这样称呼它:

getPostPromise(
  'someFooStuff',
  'someBarStuff'
).then(
  function(returnedData) {
    console.log("Good: ", returnedData);
  },
  function(responseObject) {
    console.log("Bad: ", responseObject);
  }
).catch(
  function(errorThrown) {
    console.log("Exception: ", errorThrown);
  }
);

我的服务器正在返回预期的响应,请求主体为JSON格式,但我的控制台输出为:

好:未定义

为什么我没有得到返回的数据?

感谢任何人/所有人的帮助。

-更新编辑-

我已将我的js减少为:

import $ from 'jquery';
$.get('http://localhost:8008/api/user')
  .done(function(data) {
    console.log(data);
  });

我仍然未定义为输出。如果在“网络”选项卡中打开html" target="_blank">请求,则可以看到带有正确数据的响应对象。发出了请求,我的服务器满意并响应,结果在我的浏览器中,但是完成的数据参数未定义。我很沮丧

-更新2-解决方案-

我发现问题在于使用:https :
//github.com/jpillora/xdomain来解决CORS。似乎该库以某种方式搞砸了传递值。我已经删除了它,并且将正确地实现CORS,并使用不支持它的浏览器实现它。


问题答案:

jQuery Ajax方法自身返回promise,您根本 不需要 包装它们。

但是,您当然可以这样做,以便与ES6 Promise API保持一致。

UPDATE jQuery 3.0+实现了Promise / A +
API
,因此不再需要在现代jQuery中包装任何东西。

对于3.0之前的jQuery版本,我将比您解耦的更多:

function ajax(options) {
  return new Promise(function (resolve, reject) {
    $.ajax(options).done(resolve).fail(reject);
  });
}

ajax({
  url: someURL,
  type: 'post',
  contentType: 'application/json; charset=utf-8',
  data: JSON.stringify({
    something: something,
    anotherthing: anotherthing
  })
}).then(
  function fulfillHandler(data) {
    // ...
  },
  function rejectHandler(jqXHR, textStatus, errorThrown) {
    // ...
  }
).catch(function errorHandler(error) {
  // ...
});


 类似资料:
  • 以上将给出以下随机输出: 任务很简单:确保每个promise只在另一个promise之后运行()。 由于某种原因,我找不到一个方法来做这件事。 我尝试了生成器函数(),尝试了返回promise的简单函数,但最终都归结为同一个问题:循环是同步的。 对于async,我只需使用。 你怎么解决?

  • 我正在替换一些使用jQuery延迟对象的旧代码,并且正在使用Bluebird/ES6承诺进行重写。 如果我有多个异步调用,那么在所有承诺都解决之后,我如何触发一个函数。 使用jQuery可以进行延迟: 我如何使用ES6 Promise语法重写它?

  • 在async中,如果我需要将asynchronousfunction应用于1000个项目,我可以使用: 因此,同一时间只处理10个项目,从而限制开销并允许控制。 有了ES6的promise,虽然我可以很容易地做到: 这将同时处理所有1000个项目,这可能会导致很多问题。 我知道蓝鸟有办法解决这个问题,但我正在寻找ES6解决方案。

  • 现在我的问题是,如何在自定义的而不是自定义的中重写方法?我没有在这里公布我的代码,因为它与链接的代码本质上是相同的,只是我需要为子创建一个自定义的来代替,这样它就可以按照“pptang”的答案所述进行正确的度量。 否则,有没有比在第二个RecyclerView中使用1个RecyclerView更好的方法?只能有1个RecyclerView使用上述列表和每个中唯一项的网格填充活动/片段吗?

  • 我是一个完整的打字初学者,我想知道是否有可能在打字中使用ES6promise,以及我必须做什么才能让他们工作。我正在运行节点0.11.14,在编译过程中得到一个错误“不能找到名称'promise'”

  • 问题内容: 两者之间到底有什么区别 和 第一个只是加快字段初始化速度的捷径吗?有性能方面的考虑吗? 问题答案: 第二种形式总是创建一个空的地图。 第一种形式是地图文字的特殊情况。地图文字允许创建 非空 地图: 现在,您的(通用)示例: 是没有初始值(键/值对)的地图文字。它完全等同于: 此外,这是为地图指定初始容量(大于初始分配的元素数量)的唯一方法。例: 将创建一个地图,该地图具有足够的空间来容

  • 问题内容: 查看量角器文档,我发现有一个选项可以不使用Selenium服务器使用flag 来运行量角器。 使用硒服务器和不使用硒服务器运行量角器测试之间的区别是什么,除了后者仅支持Chrome,Firefox? 问题答案: 首先,目前,您有 5种不同的内置选项/方式来连接浏览器驱动程序 : 指定在本地启动Selenium独立服务器 指定连接到正在运行的硒服务器(本地或远程) 设置并连接到Sauce

  • 代码: 上下文:尝试在JavaScript中使用 编辑: 完整代码: 编辑: 无法获取