首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >级联jQuery.Deferred

级联jQuery.Deferred
EN

Stack Overflow用户
提问于 2016-12-07 09:19:03
回答 1查看 459关注 0票数 0

不是一个“反模式”:--这不是常见的“反模式”,可以通过直接返回嵌套延迟对象来解决.这个摘录是嵌套加载的代码的严重简化,它将在不久的将来返回Deferred,因此不可能直接从原始方法返回尚未存在的Deferreds。

此外,从原始(顶级)方法返回的延迟依赖于在不久的将来创建的多个Deferreds,其中只有“拒绝”被立即回传。

我发现自己最近经常写这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
My.prototype.init=function() {
    var $dfd = $.Deferred();

    this.initSomethingElse() // returns Deferred
        .done(function() {
            $dfd.resolve();
        })
        .fail(function() {
            $dfd.reject();
        });

    return $dfd;
}

我编写了一个简短的函数来添加.link()方法来简化它,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
My.prototype.init=function() {
    var $dfd = $.Deferred();

    this.initSomethingElse() // returns $.Deferred(addLinkMethodFce)
        .link($dfd);

    return $dfd;
}

但我认为这可能太普遍了,所以其他人可能会想到,我可能错过了jQuery中的一些开箱即用的解决方案。

问题:如果链接对象被解析/拒绝,当前的延迟推断将以同样的方式被解析/拒绝,jQuery能否将现有的延迟对象与其他延迟对象联系起来?

简单地说,就像dfd1Promise = $.when(dfd2)一样,除了不需要创建新的承诺,而只是简单地将现有的对象“链接”在一起,而不创建新的对象dfd1.link(dfd2)

谢谢。

EDIT#1:,当我看到很多问题的答案时,我还没有问--比如“我应该使用延迟推断吗?”我想澄清一下情况。

我有异步加载的代码(My.prototype.init确实加载异步脚本和数据,从而使其返回给调用方)。

而且,该代码还依赖于异步第三方代码- API不能修改- initSomethingElse(),该代码也将在不久的将来被解析并返回延迟。

关键是,如果该代码被拒绝,我的代码必须被拒绝。我希望有一些神奇的标准糖语法来重复$theirDfd.reject(function() {$myDfd.reject.call(...);});,仅此而已。

简单地说,是否有一种标准的方式来执行我的$myDfd.link($theirDfd);**?** ()

我只是大大简化了情况,用几行文字来表达,所以不要被骗以为我可能不需要延期,或者其他我没有问过的东西……

EDIT#2:为了进一步澄清.link()做了什么,下面是我目前使用的助手代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Adds some syntax sugar methods to Deferred object.
 *
 *   Deferred.link(dfd, ...) - if this object resolves/rejects/progresses it will resolve/reject/progress linked object as well
 *   Deferred.linkResolve(dfd, ...) - if this object resolves it will resolve linked object as well
 *   Deferred.linkReject(dfd, ...) - if this object rejects it will reject linked object as well
 *   Deferred.linkProgress(dfd, ...) - if this object progresss it will progress linked object as well
 *
 * Methods can be appended to Deferred object by two ways:
 *
 * $dfd = edfd($.Deferred());
 * $dfd = $.Deferred(edfd);
 *
 * @access public
 * @return {Deferred}
 */
function edfd($dfd) {

    /**
     * Helper used by this.link(), this.linkReject(), this.linkProgress(), this.linkResolve()
     *
     * @access private
     * @param {Boolean} accept link this Deferred's accept call to target's accept
     * @param {Boolean} reject link this Deferred's reject call to target's reject
     * @param {Boolean} progress link this Deferred's progress call to target's progress
     * @param {Object} targets array of Deferreds or array of arrays of Deferreds
     * @return {Deferred} this (called in $dfd context)
     */
    function linker(accept, reject, progress, targets) {
        targets = dna.core.getOpts(targets, [['dfdList', 'object'], 'recursive']);

        for (var i = 0; i < targets.dfdList.length; i++) {
            var $link = targets.dfdList[i];
            $dfd.then(
                accept && function() {$link.resolve.apply($link, arguments);},
                reject && function() {$link.reject.apply($link, arguments);},
                progress && function() {$link.progress.apply($link, arguments);}
            );
        }

        return this;
    }

    /**
     * If link this Deferred's rejection/resolution/progress to all linked Deferreds.
     *
     * @access public
     * @param {...Deferred} dfd jQuery Deferred objects or arrays of Deferred objects.
     * @return {Deferred} this object
     */
    $dfd.link = function() {
        return linker(true, true, true, arguments);
    };

    /**
     * If this Deferred is resolved then resolve also linked Deferreds.
     *
     * @access public
     * @param {...Deferred} dfd jQuery Deferred objects or arrays of Deferred objects.
     * @return {Deferred} this object
     */
    $dfd.linkResolve = function() {
        return linker(true, false, false, arguments);
    };

    /**
     * If this Deferred gets rejected then reject also linked Deferreds.
     *
     * @access public
     * @param {...Deferred} dfd jQuery Deferred objects or arrays of Deferred objects.
     * @return {Deferred} this object
     */
    $dfd.linkReject = function() {
        return linker(false, true, false, arguments);
    };

    /**
     * If this Deferred progresses then progress also linked Deferreds.
     *
     * @access public
     * @param {...Deferred} dfd jQuery Deferred objects or arrays of Deferred objects.
     * @return {Deferred} this object
     */
    $dfd.linkProgress = function() {
        return linker(false, false, true, arguments);
    };

    return $dfd;
}

EDIT#3:只供那些渴望看到特定用途的人使用。对象的延迟是像这个this.$dfd = $.Deferred(edfd);一样初始化的(参见我对上面这个问题的解决方案- function edfd(...) )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Public interface as required for payment processors.
 *
 * @access public
 * @param {Object} payData
 * @return {Deferred} resolved/rejected based on payment result.
 */
Braintree.prototype.process = function(payData) {
    this.cleanUp();
    this.payData = payData;
    this.createLayer();
    this.initBraintree(payData.clientToken)
        .linkReject(this.$dfd);

    return this.$dfd;
};
EN

回答 1

Stack Overflow用户

发布于 2016-12-07 10:06:32

TL;博士

问题:如果链接对象被解析/拒绝,当前的延迟推断将以同样的方式被解析/拒绝,jQuery能否将现有的延迟对象与其他延迟对象联系起来?

我知道您在想什么以及为什么;然而,ES2015已经用承诺链解决了这个问题。很好的例子:Promise.all() (MDN链路)是这种功能的一个很酷的实现(参见:“快速失败”)。

如果需要,可以使用多个延迟的,并使用jQuery.when()将它们“链接”在一起

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var d1 = $.Deferred();
var d2 = $.Deferred();

$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
});

d1.resolve( "Fish" );
d2.resolve( "Pizza" );

(代码:https://api.jquery.com/jquery.when/)

阅读本很好的答案关于您的问题(及其相关链接)。答案为什么会对你的情况有帮助,这可能还不清楚,但是给它考虑并编写一些示例代码,你就会更好地理解。

正如其他人提到的那样:

  • 如果可能的话,你想避免 deferred's。
  • 使用.then()链接您的承诺(最后是.catch() )
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41023558

复制
相关文章
StatefulSet级联和非级联删除(一)
StatefulSet是Kubernetes中的一种有状态应用管理机制,它允许用户在集群中运行有状态应用程序,并对其进行有效的管理。StatefulSet能够确保有状态应用程序具有唯一的网络标识符、稳定的持久化存储和有序的部署、更新和删除。在StatefulSet中,有两种删除方式:级联删除和非级联删除。
玖叁叁
2023/04/30
8060
JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析
一、前言                              jQuery.Deferred作为1.5的新特性出现在jQuery上,而jQuery.ajax函数也做了相应的调整。因此我们能如下的使用xhr请求调用,并实现事件处理函数晚绑定。 var promise = $.getJSON('dummy.js') // 其他逻辑处理 promise.then(function(){ alert('late binding') })   我还一度以为这就是Promises/A+规范的实现,但其实jQu
^_^肥仔John
2018/01/18
1.9K0
StatefulSet级联和非级联删除(二)
非级联删除是指在删除StatefulSet时,Kubernetes只删除StatefulSet本身,而不删除相关的Pod和存储卷。这种删除方式适用于用户需要保留有状态应用程序的数据并在以后重新创建StatefulSet的情况。
玖叁叁
2023/04/30
6550
SQL级联删除_级联删除用例
删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了,这就是级联删除
全栈程序员站长
2022/11/10
1.4K0
级联分类器原理(级联器是什么)
级联分类器即为Emgucv中的 CascadeClassifier。使用 CascadeClassifier来加载一个.xml分类器文件,然后使用DetectMultiScale函数来对图片进行检测。 这是DetectMultiScale函数。
全栈程序员站长
2022/07/25
1.6K0
级联分类器原理(级联器是什么)
Dart中..级联操作
class Person { var name; var age; Person(this.name, this.age); getInfo() { print("${this.name},${this.age}"); } } main() { var p = new Person('张三', 20); p.getInfo(); //..为级联操作,可以同时赋值执行方法 p ..name = "李四" ..age = 30 ..getIn
明知山
2020/09/03
7510
springBean内部级联
阅读Bean官方文档的@Bean Methods in @Configuration Classes和@Bean Lite Mode小节,可了解spring对Bean内部级联的处理。
平凡的学生族
2019/05/25
6750
Pandas-20.级联
concat函数可以将Series,DataFrame和Panel对象之间相互组合在一起
悠扬前奏
2019/05/29
6660
MyBatis之级联小结
在这之前我们知道了MyBatis为我们提供了三种级联:一对一关系(assocation)、一对多关系(collection)、鉴别器(discriminator)。在最后一个鉴别器例子中,看到了当层级关系比较负责时,我们似乎已经难以应对和维护各种级联关系,在对数据库进行查询是否应用MyBatis为我们提供的级联这需要在实际中去斟酌和取舍。在我们通过级联来查询信息时会发现有一个问题,当我们只想查询出学生的普通信息(姓名、性别),而不想查询出他的成绩、课程、体检表时,之前的三个例子不管你是否需要成绩、课程等信息
用户1148394
2018/01/09
7500
MyBatis之级联小结
注解方式实现级联
级联分为一对多,多对一单向,多对多双向关联。一般情况下,我们只会用到前两种情况,多对多用的较少。我这里使用省市区三级联查来实现级联的操作。简单来说,一对多就是一个省下面有多个市,一个市下面有多个县。多对一是刚好反过来的。
微醺
2019/01/17
6370
城市地级联选择
主要是要符合这个数据结构,需要进行二次处理,可以是一级,二级,三级,四级,甚至五级,如有不明白的,可以交流
itclanCoder
2021/12/06
2.3K0
SpringMVC容器级联关系探究
SpringMvc是目前使用最频繁的框架,springmvc里面经常会使用两级级联容器,并且每层容器都各有用途,本文就来探究下这两层级联容器融合创建。
加多
2018/09/06
5180
SpringMVC容器级联关系探究
easy ui的三级联动,两级联动
<select id="hdprovinceId" class="easyui-combobox" name="hdprovinceId" style="width:100px;" data-options=" editable:false, valueField:'ID', textField:'TEXT', url:'<%=basePath%>getProvince', onSelect: function(rec){ getCity(r
斯文的程序
2019/11/07
1.9K0
级联下拉菜单效果
<!doctype html> <html> <head> <script src="jquery.js"></script> <script> $(function(){ $(".menu li,.menu ul li").mouseenter( function(){ $(this).children("ul").stop(true,true).slideDown(100).animate({opacity:1},20); } ).mouseleave( function(){ $(
用户1730674
2018/05/02
4.8K0
级联下拉菜单效果
二级联动
二级联动主要应用于省市定位,例如美团,饿了么,等需要位置的地方.... <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>省市联动</title> <style type="text/css"> select{ height: 30px; width: 80px;
河湾欢儿
2018/09/06
1.5K0
easyUI的combobox实现级联
easyUI重写了select,取而代之的是combobox,有如下几种方式可以创建一个combobox
全栈程序员站长
2022/11/03
1.9K0
js用于树型结构级联选择 支持三态级联选择
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>及联选择-用于权限选择比较合适</title> </head> <body> <ul id="tree">     <li><input type=checkbox>         <ul>             <li><input type=checkbox>                 <ul>
用户1183026
2018/01/19
2.5K0
js多级联动示例(省份和城市二级联动)
本文描述的省份和城市二级联动下拉菜单,在js部分设置省份和城市信息,当然也可以将数据保存在数据库中,当需要使用的时候在读取。这里用的是js原生代码 在html文件中设置省份、城市下拉列表如下: <select id="pro" onchange="addCity();"></select> <select id="city"></select> 在js中设置省份信息代码如下: var province=["北京","上海","广东","江苏","浙江","重庆","安徽","福建","甘肃","广西", "
lonelydawn
2018/02/09
9.6K0
C++级联函数调用
要实现这样的调用,就必须在类的成员函数之中,返回一个*this指针,这也是实现级联函数调用的关键。
灯珑LoGin
2022/10/31
8770
点击加载更多

相似问题

关于jQuery.Deferred()

10

对变量使用jQuery.Deferred?

11

jvectormap中的jQuery.Deferred异常

212

jQuery.Deferred与setTimeout

14

jQuery.Deferred异常:$(...).datepicker不是函数

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文