在 JavaScript 中,如何在超时中包装承诺?

2024-02-08

使用 deferred/promise 实现某些异步函数的超时是一种常见的模式:

// Create a Deferred and return its Promise
function timeout(funct, args, time) {
    var dfd = new jQuery.Deferred();

    // execute asynchronous code
    funct.apply(null, args);

    // When the asynchronous code is completed, resolve the Deferred:
    dfd.resolve('success');

    setTimeout(function() {
        dfd.reject('sorry');
    }, time);
    return dfd.promise();
}

现在我们可以执行一些名为的异步函数myFunc并处理超时:

// Attach a done and fail handler for the asyncEvent
$.when( timeout(myFunc, [some_args], 1000) ).then(
    function(status) {
        alert( status + ', things are going well' );
    },
    function(status) {
        alert( status + ', you fail this time' );
    }
);

好吧,让我们来扭转这个故事吧!想象一下myFunc本身返回一个承诺(注意:承诺不延迟,我无法更改它):

function myFunc(){
    var dfd = new jQuery.Deffered();
    superImportantLibrary.doSomething(function(data)){
       if(data.length < 5){
            dfd.reject('too few data');
       }
       else{
           dfd.resolve('success!');
       }
    }, {'error_callback': function(){
        dfd.reject("there was something wrong but it wasn't timeout");}
    }});
    return dfd.promise();
}

现在如果我包装myFunc in timeout,我将失去处理与超时不同的错误的能力。如果myFunc发出进度事件,我也会失去它。

那么问题来了:如何修改timeout函数以便它可以接受返回承诺的函数而不丢失其错误/进度信息?


function timeout(funct, args, time) {
    var deferred = new jQuery.Deferred(),
        promise = funct.apply(null, args);

    if (promise) {
        $.when(promise)
            .done(deferred.resolve)
            .fail(deferred.reject)
            .progress(deferred.notify);
    }

    setTimeout(function() {
        deferred.reject();
    }, time);

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

在 JavaScript 中,如何在超时中包装承诺? 的相关文章

随机推荐

  • 了解 CSS 选择器优先级/特异性

    我想了解 CSS 选择器如何处理属性冲突 如何选择一种财产而不是另一种财产 div background color red div my class background color black div my id background
  • 在Eclipse中一步步调试java程序

    我想逐行调试java程序的整个流程 我正在使用eclipse 我怎样才能做到这一点 在 Eclipse 中调试 Java 程序需要多个步骤 例如 设置断点 启动调试器 控制程序的执行 对于逐行使用 F6 和 F5 进入方法 评估变量等 把所
  • 如何让 ES6 生成器等待 Promise,就像在 redux-saga 中一样?

    我读过 生成器不会等待承诺 为什么发电机的情况并非如此 redux saga 以及如何让我自己的发电机等待 例如 这个传奇 takeLatest FETCH USER REQUESTED function const fetchPromis
  • 如何使用反应式表单包装像自动完成这样的 primeng 组件?

    我想将 primeng 自动完成组件包装在我自己的组件中 但无法弄清楚如何提供 formControlName 错误 未捕获 承诺中 错误 formControlName 必须与父 formGroup 指令一起使用 包装组件 html
  • 防止 OS X Chrome 和 Safari 上的弹性滚动

    我正在寻找一种方法来防止 Chrome 和 Safari 中 OS X 上发生的弹性滚动 如果你不明白我的意思 那就是当页面位于顶部时向上滚动 或当页面位于底部时向下滚动 并且页面后面会显示灰色背景 对于单页应用程序有一个 css 解决方案
  • connect-mongo 每秒创建新会话

    我的 Nodejs 应用程序托管在 Openshift 上 这是我的规格 节点 v0 10 35 express v3 4 8 我的 package json 依赖项 dependencies angular loading bar 0 9
  • 画布缩放通过 CSS 还是 JS 性能更高?

    以下文档提到了 HTML5 Canvas 性能缩放的一些准则 https developer mozilla org en US docs Web API Canvas API Tutorial Optimizing canvas Scal
  • 去掉小数点后的 0 值

    我想问是否有人知道删除十进制 0 值的查询 例如 字段名称百分比具有这些值 Percent 770 00000000000000000000 340 670000000000000000000 96 00000000000000000000
  • 如何使用 @angular/http 返回字符串而不是 Observable

    我正在将 Angular 4 与 net core WEB API 挂钩 Web API 根据传入的 ID 以字符串形式返回 CustomerName 这是 Angular 4 中的服务方法 我知道 Angular http 必须返回一个
  • 控制器如何手动设置某个字段的验证错误

    我有一个包含 3 个 ActiveRecord 字段的表单 其中一个字段有一种愚蠢的 依赖于国家的验证要求 例如 如果在设置向导表单上创建对象 我仅验证该字段 在我的 POST 处理程序中创建对象时 我想我可以调用errors add 来插
  • python 中的 Mechanizer - 选择没有名称的表单字段

    我有一个类似的问题选择机械化表单中的未命名文本字段 python https stackoverflow com questions 4787907 selecting an unnamed text field in a mechaniz
  • 使用 C++11 基于范围的正确方法是什么?

    使用 C 11 基于范围的正确方法是什么for 应该使用什么语法 for auto elem container or for auto elem container or for const auto elem container 或者其
  • SQL Server 不区分大小写的排序规则

    在 SQL Server 中使用不区分大小写的排序规则有哪些优点 缺点 就查询性能而言 我有一个数据库当前正在使用不区分大小写的排序规则 但我不太喜欢它 我非常想将其更改为区分大小写 更改排序规则时应该注意什么 如果更改数据库上的排序规则
  • 需要有关奇怪的 java.net.HttpURLConnection 行为的帮助

    我正在尝试使用 HttpURLConnection 下载 jpg 但遇到了一个非常奇怪的错误 这是网址 http www vh1 com sitewide promoimages shows m my antonio video super
  • 如何在 angularjs 中添加悬停元素的延迟?

    我有一个元素 span Hover Me span div class outerDiv p Some content p div class innerDiv p More Content p div div 这是JS mouseente
  • 即使安装包后,R 也找不到包

    我一直与zoo包 我很久以前就安装了 今天 我创建了一个新的 R 脚本 并运行library zoo 并得到以下错误 gt library zoo Error in library zoo there is no package calle
  • 暴力破解 PBKDF2 的速度大约有多快?

    在 linkedin 密码哈希泄露之后 我一直在研究我们的密码哈希 我们使用 Django 1 4 它使用 PBKDF2 这很棒 比之前的 SHA1 更进一步 然而我很好奇人们如何轻松地暴力破解这一点 我正在查看我们的密码复杂性规则 并且想
  • 使用 ES6 类的快速路由

    因此 以下代码在开发中有效 但在生产环境中运行时失败 并出现错误TypeError Router use requires middleware function but got a Object 到目前为止 我一定已经尝试了大约一百种不同
  • 从结构体数组中删除元素

    这可能是一个超级简单的问题 但它是 我有一个 结构数组 以及一个要删除的结构数组索引向量 例如 如果我有一个删除向量 2 6 这意味着我想删除数组中的第二个和第六个结构 并且数组将短 2 个元素 干净 简单的 matlab 方法是什么 如果
  • 在 JavaScript 中,如何在超时中包装承诺?

    使用 deferred promise 实现某些异步函数的超时是一种常见的模式 Create a Deferred and return its Promise function timeout funct args time var df