问题标签 [deferred]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
32383 浏览

jquery - 如何使用 jquery 链接 ajax 调用

我需要在不锁定浏览器的情况下发出一系列 N ajax 请求,并希望使用 jquery deferred 对象来完成此操作。

这是一个包含三个请求的简化示例,但我的程序可能需要排队超过 100 个(注意这不是确切的用例,实际代码确实需要确保步骤(N-1)成功,然后再执行下一个步):

这是写入控制台的内容(所有请求都是并行发出的,响应时间与预期的每个国家/地区的数据大小成正比:

如何让延迟对象为我排队?我尝试将 done 更改为 pipe 但得到相同的结果。

这是期望的结果:

编辑:

我很欣赏使用数组来存储请求参数的建议,但是 jquery deferred 对象能够对请求进行排队,我真的很想学习如何充分利用这个功能。

这实际上是我正在尝试做的事情:

但是,我想一次将请求分配到管道中,以便有效地使用每个遍历:

0 投票
1 回答
1676 浏览

dojo - Dojo 延迟链接

我在思考如何使 Dojo Deferred 为以下场景工作时遇到了麻烦。基本上我有一个函数应该循环遍历多个项目并以延迟方式分别处理每个项目。它在一个单独的方法中处理每个项目,该方法在完成时返回一个 Deferred。我希望能够执行循环以关闭并处理每个项目,并在完成后报告成功或失败。到目前为止,这是我得到的测试样本:

http://jsfiddle.net/Ayyoudy/mgv6Y/12/

我究竟做错了什么?我期望输出数字是按顺序排列的,但它们不是。

我还希望能够检测处理其中一个项目是否存在错误,如果是,则不处理其余项目。

谢谢

0 投票
2 回答
956 浏览

jquery - 将来自多个延迟 Ajax 调用的数据与其调用者配对

我正在处理多个延迟的 Ajax 调用,我希望动态了解我如何访问他们的数据。我不想将多个参数硬编码到 .then 回调中并单独使用每个参数,而是希望循环访问参数对象以访问数据。这工作正常,除了我无法从 json 中确定哪些数据来自哪个 Ajax 调用。我可以通过从 promise 对象(以某种方式)确定 url 或确定 Ajax 调用执行的顺序并假设数据的顺序相同来解决这个问题。

到目前为止,这是我的代码(为了说明我正在尝试做的事情而进行了模拟):

是否有另一种方法可以将每个参数与产生它的 Ajax 调用相匹配?我不想做的是:

谢谢!萨拉

0 投票
1 回答
2853 浏览

dojo - Dojo JSONP 请求后响应存储在哪里?

JavaScript

例如,我有以下 JavaScript 代码(Dojo 1.6 已经加载):

浏览器直接查询

我知道我的服务器会收到查询,就好像我在地址栏中输入了以下内容一样:

预期响应

如果我直接使用浏览器地址栏查询我的服务器,我将收到,application/json在浏览器中呈现的 MIME 类型和纯文本,如下所示:

问题

现在,回顾 JavaScript 的第二部分,我将使用dojo.io.script.get(jsonpArgs). 这会返回一个Deferred对象,我可以通过链接它来利用.then它。请注意,我为.then事件定义了处理程序,以将捕获的内容输出data到控制台。

但是,我在控制台中得到的只是一个Event. 我试图搜索它的数据树,但我找不到我期望的数据。

问题

  1. JSONP 请求的响应存储在哪里?我如何找到它?
  2. 我的服务器(由我控制)仅输出请求数据的明文呈现,包装在callback函数中(此处指定为recover),并指定application/jsonMIME 类型。我还需要在我的服务器上设置什么,以便Deferred对象捕获响应数据吗?

尝试的解决方案

我实际上可以通过定义回调函数来恢复响应(在这种情况下recover,在 JavaScript 的第三部分)。但是,在 Dojo 教程中,他们只是使用Deferred(and .then) 框架恢复了数据。我如何使用 Dojo 来做到这一点Deferred

更新(使用 Dojo 教程中的 Twitter 示例)

以 Dojo 教程Getting Jiggy With JSONP中的这个脚本为例。我对其进行了编辑以将数据记录到控制台。

对于console.log(data),我得到一个Object,而不是Event我的案例所示的一个。由于该示例暗示数据位于 中data.results,因此我也尝试浏览此树,但我没有看到来自 Twitter 的预期数据。我不知所措。

对于console.log(data.results),我得到一个 s 数组Object。如果我直接查询 Twitter,这就是我得到的明文。每个都Object包含通常的推文元数据,如用户名、时间、用户画像和推文本身。很容易。

这一击正中我的头。链的处理程序.then,一个匿名函数,只接收一个参数data。但是为什么我从中得到的属性和返回的results对象console.log(data) 不同console.log(data.results)

0 投票
1 回答
2460 浏览

python - Python Twisted Deferred:需要澄清

我希望对处理“第一个” deferreds的最佳方法进行一些澄清,即不仅仅是将回调和 errbacks 添加到返回 deferred 的现有 Twisted 方法,而是创建这些原始deferreds 的最佳方法。

作为一个具体的例子,这里有两种相同方法的变体:它只计算一些相当大的文本文件中的行数,并用作延迟链的起点。

方法一: 这个感觉不太好,因为deferred是直接被reactor.callLater方法触发的。

方法 2:稍微好一点,因为结果可用时, 实际上会触发 deferred

注意:您还可以指出,这两种方法实际上都是同步的,并且可能是阻塞方法,(我也许可以使用“ MaybeDeferred ”?)。但是,这实际上是我感到困惑的方面之一。

  1. 对于方法 2,如果count_lines方法非常慢(计算一些大文件中的行数等),它是否可能会“阻止”整个 Twisted 应用程序?我阅读了很多关于回调和 errbacks 以及反应器如何一起工作的文档(回调需要快速执行,或者自己返回延迟等),但在这种情况下,我只是没有看到并且真的很感激一些指针/例子等

  2. 是否有一些文章/明确的解释来处理创建这些“第一个”延迟的最佳方法?我已经阅读了这些优秀的文章,它们对一些基本的理解有很大帮助,但我仍然觉得我缺少一部分。

  3. 对于阻塞代码,这是DeferToThreadreactor.spawnprocess的典型情况吗?我阅读了很多类似这个这篇文章的问题,但我仍然不能 100% 确定如何处理潜在的阻塞代码,主要是在处理文件 i/o 时

对不起,如果这看起来太基本了,但我真的想更彻底地掌握使用 Twisted 的窍门。(对于所有更多面向网络的方面来说,它都是一个非常强大的工具)。感谢您的时间!

0 投票
2 回答
2946 浏览

javascript - jQuery或纯JS:事件监听器返回后执行函数

假设我bar在 element 上有一个名为 ""的事件#foo

有没有一种方法可以使用 jQuery 延迟对象来强制函数在bar事件侦听器已经/已经执行(返回)后立即执行,无论是否有任何bar侦听器取消事件?

或者也许我什至不需要 jQuery?

编辑:澄清一下,从bar处理程序中触发另一个事件或函数并不是我想要的——bar处理程序还没有返回,所以这不是“在那个bar事件之后”。这个问题可能看起来很奇怪而且没有意义,因为我试图解决 IE 8 中的一个非常具体的问题/错误。

需要这样的东西:

0 投票
1 回答
226 浏览

jquery - 谷歌应用引擎 + jquery ajax 延迟 + 游标

我使用谷歌应用引擎来运行我的某些项目。由于它对请求施加了 30 秒的时间限制,我使用游标和内存缓存来限制数据获取过程。

问题陈述:

  1. 我有一个 ajax 调用日志,它基本上是我需要从服务器获得的所有详细信息的列表,由一些用户交互创建
  2. 调用日志中的每个 ajax 调用都可能有数据,这可能会导致 30 秒的限制达到。所以我需要把它分解并分部分归还。
  3. 完成日志中的所有调用后,我需要根据返回数据执行一些自定义逻辑。

现在,我已经有了一个以这种方式工作的解决方案:

  1. 使用一些随机标识符启动第一个 ajax 调用
  2. 返回时,检查一些参数以确定是否已获取所有必需的数据。
  3. 如果没有,则再次执行调用,使用与步骤 1 中相同的随机标识符 + 保存到目前为止已获取的任何数据
  4. 如果是,请从日志中删除该项目并为下一个项目重复步骤

但是所有这些代码当前都在 ajax 调用的成功事件中处理。我阅读了有关jQuery Deferreds的信息,它似乎是修复当前正在使用的残暴代码的一个非常好的候选者。

我已经弄清楚了以下几点:

  1. 用于$.when.apply(null, arrayOfDeferreds)创建各种动态调用列表 - 阅读jQuery.when
  2. 我现在可以使用 deferred.done 函数为每次调用保存数据转储
    问题是,我如何告诉 deferred 如果需要再次调用请求,那么不要解析 ajax 请求 - 只需保存我的数据并使用与初始调用相同的随机标识符再次执行调用?也就是说,基本上重复调用我的完成函数,直到保存所有数据?如果有更好的方法可以做到这一点,请提供解释。
0 投票
2 回答
1109 浏览

jquery - jQuery - 连接未知数量的 Ajax 请求的结果

这可能非常简单,也可能非常复杂,我目前不确定。

我正在编写一个基于 Cineworld API 的小型网络应用程序,它将执行电影时间表。

我正在使用 AJAX 拉回数据,这很好,但我已经到了想要获取所有选定电影的所有时间然后继续操作它们的地步,但是结合所有结果是证明有点问题。

生成的 API 调用只能在单个电影上完成,因此我必须依次拉回每部电影的数据。

您可以在此处查看应用程序的当前状态:http: //www.lewishowles.co.uk/film/

主要内容在这个文件中:http: //www.lewishowles.co.uk/film/js/lh.js

线42206是我的问题。42总是记录一个空数组,但如果我206每次都记录下数组,那就没问题了。不过,日志记录显然对我没有多大帮助。看起来登录42并没有等待它上面的函数中的所有代码完成。

如您所见,我尝试了一个全局数组,我尝试了返回值,但它似乎仍然太快地运行日志。

Deferred 似乎通常是这种情况,但是每次都会有不同数量的 ajax 调用,并且您似乎需要知道使用 Deferred 的数量。

将 async 设置为 false 可以阻止它们相互绊倒,但这无助于这种情况。

我能想到的两件事是使用会话存储或将每个循环的结果隐藏在 HTML 中稍后我必须访问的某个地方,但这两者似乎都容易出现相同的问题。

另一个想法是按下另一个按钮,以便有时间加载数据,但这增加了另一个步骤,并不理想。

有任何想法吗?

0 投票
3 回答
8028 浏览

javascript - 如果库正在吞噬所有异常,我该如何调试我的异步、基于 Promise 的代码?

问题

JSFiddle:http: //jsfiddle.net/missingno/Gz8Pe/2/

我有一些看起来像这样的代码:

问题是,当我在 IE 上时,我只能看到'obj' is null or not an object错误,没有任何对相应行号的引用,也没有调试器在有问题的行处停止(就像我希望的那样)。

这类问题使代码难以调试,而我现在能想到的唯一解决方案(弄乱控制流库或使用调试器或 console.log 进行逐步调试)是我宁可不用做。

我认为正在发生的事情

为了允许在触发链后添加 errbacks,then将抢先捕获回调抛出的任何异常。我认为这是 IE 调试器没有停止错误或显示带有行号的通常错误消息的原因。

没有行号的错误消息来自控制流库:它提供了一个deferredOnError挂钩,每当捕获到异常并保存以供以后使用时都会调用该挂钩,默认行为是 console.error-ing 错误对象:

可悲的是,我无法找到从 IE 中的错误对象获取行号或堆栈跟踪的方法,并且该挂钩的调用方式不允许我重新抛出异常并让它冒泡到顶层。

我想要的是

我希望有一种更好的方法来调试异步代码,然后一步一步地与调试器一起进行。在最好的情况下,一种让调试器在异常上停止的方法(就像它在未处理的异常上所做的那样),或者至少是一种从抛出的 Error 对象中获取行号或堆栈跟踪的方法。

0 投票
2 回答
370 浏览

javascript - 传递一个向 $.when .done 发出 ajax 请求的函数

我想即时生成 ajax 请求,但我想确保在它们全部完成后得到回调,所以我想将它们包装在 .when .done 语句中,如下所示:

我的选项是一个对象数组,其中包含我想同时发出的每个 ajax 请求的文件路径和数据类型。此代码将返回成功,但参数只是一个函数,ajax 请求永远不会通过。关于如何做到这一点的任何想法?