Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 级联jQuery.Deferred_Javascript_Jquery_Jquery Deferred - Fatal编程技术网

Javascript 级联jQuery.Deferred

Javascript 级联jQuery.Deferred,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,不是“反模式”:这不是常见的“反模式”,只需直接返回嵌套的延迟对象即可解决。。。这段摘录对嵌套的延迟加载代码进行了大量简化,这些代码将在不久的将来返回Deferred,因此不可能直接从原始方法返回尚未存在的Deferred 除此之外,从原始(顶级)方法返回的延迟取决于在不久的将来创建的多个延迟,其中只有“拒绝”会立即转发回 我发现自己最近经常写这样的东西: My.prototype.init=function(){ var$dfd=$.Deferred(); this.initSomethin

不是“反模式”:这不是常见的“反模式”,只需直接返回嵌套的延迟对象即可解决。。。这段摘录对嵌套的延迟加载代码进行了大量简化,这些代码将在不久的将来返回Deferred,因此不可能直接从原始方法返回尚未存在的Deferred

除此之外,从原始(顶级)方法返回的延迟取决于在不久的将来创建的多个延迟,其中只有“拒绝”会立即转发回


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

My.prototype.init=function(){
var$dfd=$.Deferred();
this.initSomethingElse()//返回Deferred
.done(函数(){
$dfd.resolve();
})
.fail(函数(){
$dfd.reject();
});
返回$dfd;
}
我编写了一个简短的函数,在Deferred上添加.link()方法,将其简化如下:

My.prototype.init=function(){
var$dfd=$.Deferred();
this.initSomethingElse()//返回$.Deferred(addLinkMethodFce)
.link(dfd美元);
返回$dfd;
}
但我认为它可能太常见了,所以其他人可能想到了它,而我可能错过了jQuery中的一些开箱即用的解决方案

问题:jQuery能否以一种方式将现有的延迟对象与其他延迟对象链接起来,即如果链接对象被解析/拒绝,那么当前的延迟对象将以同样的方式被解析/拒绝

简单的类似于
dfd1Promise=$.when(dfd2)
的东西,除了不需要创建新的Promise之外,更简单的是将现有对象“链接”在一起而不创建新对象
dfd1.link(dfd2)

谢谢


编辑#1:当我看到许多我没有问过的问题的答案时,比如“我应该使用延期吗?”我想澄清一下情况

我正在异步加载代码(
my.prototype.init
会加载异步脚本和数据,从而使其延迟返回给调用方)

该代码还依赖于异步第三方代码—我无法修改的API—
initSomethingElse()
,该代码也将在不久的将来得到解决并延迟返回

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

是否有一种标准的方式来执行我的
$myDfd.link($theirDfd)

我只是大大简化了情况,用几行字来表达,所以不要上当受骗,以为我可能不需要延期或其他我没有要求的东西


编辑#2:为了进一步阐明.link()的作用,下面是我目前使用的帮助程序代码:

/**
*向延迟对象添加一些语法糖方法。
*
*Deferred.link(dfd…)-如果此对象解析/拒绝/前进,它也将解析/拒绝/前进链接对象
*Deferred.linkResolve(dfd,…)-如果此对象解析,它也将解析链接对象
*Deferred.linkReject(dfd…)-如果此对象拒绝,它也将拒绝链接对象
*Deferred.linkProgress(dfd,…)-如果此对象继续,它也将继续链接对象
*
*方法可以通过两种方式附加到延迟对象:
*
*$dfd=edfd($.Deferred());
*$dfd=$递延(edfd);
*
*@access-public
*@return{Deferred}
*/
功能edfd($dfd){
/**
*this.link()、this.linkReject()、this.linkProgress()、this.linkResolve()使用的帮助程序
*
*@access-private
*@param{Boolean}accept将此延迟的accept调用链接到目标的accept
*@param{Boolean}reject将此延迟的拒绝调用链接到目标的拒绝
*@param{Boolean}progress将此延迟的进度调用链接到目标的进度
*@param{Object}以延迟数组或延迟数组为目标
*@return{Deferred}this(在$dfd上下文中调用)
*/
函数链接器(接受、拒绝、进度、目标){
targets=dna.core.getOpts(targets,[['dfdList','object'],'recursive']);
对于(变量i=0;ivar 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" );