jQuery - .always() 回调触发得太快

2023-12-02

我正在开发一个客户端 JS 应用程序,该应用程序应该读取 CSV 文件,每行进行一些 API 调用,然后将结果写回 CSV。我所关注的部分是如何编排请求并在所有完成后触发一个函数。这是我到目前为止所拥有的:

var requests = [];

// loop through rows
addresses.forEach(function (address, i) {
    // make request
    var addressRequest = $.ajax({
            dataType: 'json',
            url: 'http://api.com/addresses/' + address,
            success: function (data, textStatus, jqXhr) { APP.didGetAddressJson(data, i, jqXhr) },
            error: function (jqXhr, textStatus, errorThrown) { APP.didFailToGetAddressJson(errorThrown, i) },
        });
    requests.push(addressRequest);

    // make some more requests (handled by other success functions)
});

// leggo
$.when.apply($, requests).done(APP.didFinishGeocoding);

问题是,如果其中一行抛出 404done函数未被调用。我把它切换到always现在它被调用,但不是在最后——如果我将每个回调的执行记录到控制台,它通常在中间的某个地方。但是,如果我编辑 CSV,那么就不会出现错误,它会按预期在最后被调用。我在这里做的事情是否允许always早点开火?

Update:难道只是控制台正在记录它出故障?


您需要防止发送返回的承诺时出现错误$.when.apply($, requests)沿着错误路径。

这可以通过以下方式实现:

  • 链接.then()给你的$.ajax()调用,而不是指定“成功”和“错误”处理程序$.ajax()选项。
  • 通过转换为成功来处理错误(因为这是 jQuery,您必须从错误处理程序返回已解决的承诺)。

这种方法还允许您控制最终传送到的数据APP.didFinishGeocoding()

通过一些假设,代码的一般形式应如下所示:

function foo () {//assume there's an outer function wrapper 
    var errorMarker = '**error**';

    var requests = addresses.map(function (address, i) {
        return $.ajax({
            dataType: 'json',
            url: 'http://api.com/addresses/' + address
        }).then(function (data, textStatus, jqXhr) { //success handler
            return APP.didGetAddressJson(data, i, jqXhr); //whatever APP.didGetAddressJson() returns will appear as a result at the next stage.
        }, function (jqXhr, textStatus, errorThrown) { // error handler
            APP.didFailToGetAddressJson(errorThrown, i);
            return $.when(errorMarker);//errorMarker will appear as a result at the next stage - but can be filtered out.
        });
        // make some more requests (handled by other success functions)
    });

    return $.when.apply($, requests).then(function() {
        //first, convert arguments to an array and filter out the errors
        var results = Array.prototype.slice.call(arguments).filter(function(r) {
            return r !== errorMarker;
        });

        //then call APP.didFinishGeocoding() with the filtered results as individual arguments.
        return APP.didFinishGeocoding.apply(APP, results);

        //alternatively, call APP.didFinishGeocoding() with the filtered results as an array.
        //return APP.didFinishGeocoding(results);
    });
}

根据需要进行调整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery - .always() 回调触发得太快 的相关文章

随机推荐

  • Rails - 当我仅访问生产中的操作时,401 未经授权

    我正在使用 Ruby On Rails 3 0 9 并且在开发环境中一切正常 当我切换到生产环境或将其上传到我们的服务器时 登录后我会返回到相同的登录页面 当我检查日志时 我可以看到以下内容 Started POST users login
  • C# 7.0 适用于 .NET 4.5 吗?

    我在 Visual Studio 2017 RC 中创建了一个项目 以检查是否可以在 NET Framework 4 5 项目中使用新的 C 7 0 语言功能 在我看来 参考后System ValueTupleNuGet 新元组工作正常 还
  • 如何让边框底部更接近文本?

    我想对链接使用边框底线 而不是文本装饰下划线 但我需要让线条更靠近文本 负填充是不可能的 那么我该怎么办 这是一个例子 a color 245fc1 position relative border bottom 1px solid 245
  • 如何在 Visual Studio 模拟器上删除设备的框架?

    我只需要与开发和测试相关的内容 我不需要巨大的 模拟 哑边框区域 该区域主要用于抓取和重新定位模拟器窗口 如今 即使是真正的设备也开始消除这些边框 我不需要它提供的有关设备方向的方向线索 在工具条或主窗口中 只需小的抓握手柄就足够了 它浪费
  • Angular v10 Service Worker 官方更新方法不起作用

    编辑摘要 我创建了一个最小的可重现的例子 我不再相信这与 css 或任何相关 font face就此问题作出的声明 问题在于官方的 Angular 方式swUpdate checkForUpdate 可能与appRef isStable订阅
  • 如何使用 Express 服务器对 api.github 进行 GET 调用

    我已经被封锁三天了 并在互联网上进行了研究 这是代码 api js const express require express const router express Router var http require http var ht
  • 如何使用内胚包装器来修复这个练习?

    这是我之前的后续question 假设我需要按路径查找 XML 节点 我可以编写一个函数来按名称获取子节点 import scala xml Node gt XmlNode def child name String XmlNode Opt
  • 将 print 的输出分配给 python 中的变量

    我想知道如何将 print 的输出分配给变量 so if mystring a 12 then print mystring a 12 我想像 kwargs 一样传递这个 test mystring 我怎样才能做到这一点 有关更多解释 我有
  • 如何使用自定义ant规则正则表达式更改属性文件中的属性

    在我的 Android 项目中 我在 project properties 文件中设置了以下属性 proguard config proguard cfg 我需要一个自定义宏来以某种方式设置和取消设置此属性 如何使用宏和正则表达式设置取消设
  • C# 引用和指针有什么区别?

    我不太明白 C 引用和指针之间的区别 它们都指向记忆中的某个地方 不是吗 我能弄清楚的唯一区别是指针不那么聪明 不能指向堆上的任何东西 可以免于垃圾回收 并且只能引用结构或基类型 我问这个问题的原因之一是 人们认为人们需要很好地理解指针 我
  • 在curl中发送json文件并使用plumber在R中接收它

    我需要发送一个包含多个值的 json 文件并使用水管工在 R 中接收它 我尝试过这个 但它似乎不起作用 library rjson install packages rjson get predict post predict functi
  • Jquery 实时复制另一个文本框值

    我想获取另一个文本框的值并将其实时输入到另一个文本框中 如何检测 TEXT 3 是否已更改 如果 TEXT 3 值更改 则必须将其输入到 TEXT 4 为了您的方便 这里是代码和演示 HTML
  • 使用PHP查询MDB文件,并返回JSON

    我有一个 Microsoft Access 数据库 我正在尝试使用 PHP 查询该表 并输出有效的 JSON 我有一个 MSSQL 数据库的等效代码 我正在尝试让我的代码做同样的事情 但只是针对 Access 数据库 这是MSSQL代码 m
  • Angular2 嵌套 formGroups - formArrays 和模板绑定

    问题是这样的 我有一个带有嵌套表单组的复杂表单 这是它的 简化 结构 gt MyForm formGroup gt Whatever01 formControl input gt Whatever02 formControl input g
  • Bundler如何卸载冲突的依赖项

    我正在尝试执行vagrant plugin install vagrant vbguest在我的 Mac 上 ProductName Mac OS X ProductVersion 10 12 6 BuildVersion 16G29 但之
  • 分页时出现 SQL 错误

    大家好 我们有一个完美工作的关系控制器网页 index admin 但在添加分页后 它全部崩溃了 想出 SQLSTATE 42S22 Column not found 1054 Unknown column Relationship sen
  • 我想在 Nuxt.js 中的 Vuex 中使用 window.localStorage

    我开发 nuxt js 应用程序 重点是登录和注销 我们将开发 JWT 系统的登录 您必须保持 vuex 登录状态 但是 当我刷新页面时 vuex 被初始化 我读过 gitvuex 持久状态 但很难理解如何初始化和设置它 在 nuxt js
  • WPF 使用数据绑定显示格式化的多行文本

    我需要使用 WPF 数据绑定显示以下内容 值发生变化 标题必须是粗体 信息行是普通文本 如果给定标头的信息不存在 我想折叠该部分 包括标头 我更喜欢所有数据 标题和信息项 都位于一个格式化字符串中 该字符串可以在我想要的位置换行 Heade
  • 我们应该支持哪些 Xamarin ABI

    目前 我认为我们的 Xamarin Android 应用程序 PCL 非常庞大 即使在发布模式下也是如此 我怀疑这是由于支持的架构造成的 目前我们已将它们全部选中 有谁知道我们是否必须选择所有这些 我们也根本不使用 Android NDK
  • jQuery - .always() 回调触发得太快

    我正在开发一个客户端 JS 应用程序 该应用程序应该读取 CSV 文件 每行进行一些 API 调用 然后将结果写回 CSV 我所关注的部分是如何编排请求并在所有完成后触发一个函数 这是我到目前为止所拥有的 var requests loop