Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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
Jquery 等待连锁延期完成_Jquery - Fatal编程技术网

Jquery 等待连锁延期完成

Jquery 等待连锁延期完成,jquery,Jquery,我想知道什么是链接延迟的最佳设计。请考虑以下片段: 组成部分X: _functionRaisingEvent: function() { $.when(this.raiseEvent('myEvent', args)).done(function(args){ // Check for args.cancel }); }, _raiseEvent: function(event, args) { var def = new $.Deferred(); // Call

我想知道什么是链接延迟的最佳设计。请考虑以下片段:

组成部分X:

_functionRaisingEvent: function()
{
    $.when(this.raiseEvent('myEvent', args)).done(function(args){ // Check for args.cancel });
},

_raiseEvent: function(event, args)
{
    var def = new $.Deferred();

    // Call subscribers of myEvent in different components and pass them args
    // Subscribers possibly make ajax calls

    return def.promise();
},
用户Y:

_onMyEvent:function(args)
{
    $.ajax(....).done(function(data){ if(data == 1) args.cancel = true;});
},
订户Z:

_onMyEvent:function(args)
{
    document.getElementById('abx').display = 'block';
}
_函数raisingevent calls\u raiseEvent触发订阅者的回调

我想要实现的是,只有在所有订阅服务器完成后,才会执行在_functionRaisingEvent中完成的回调


我应该将自己的延迟作为参数传递给订阅者并使用管道吗?产品是否有最佳实践或设计模式

关键在于改变这部分

_raiseEvent: function(event, args) {
    var def = new $.Deferred();
    //Call subscribers...
    return def.promise();
}
…返回延迟的集合,而不仅仅是一个,然后将这些作为集合传递给
$。当
时。由于
$。当
不接受集合并坚持将对象作为单独的参数传递时,常见的解决方法是通过所有函数继承的
apply()
方法调用
$

_raiseEvent: function(event, args) {
    var def = new $.Deferred();
    //Call subscribers... - let's assume each returns an AJAX object
    var result_subscr1 = call_subscriber_1();
    var result_subscr2 = call_subscriber_2();
    return [def.promise(), result_subscr1, result_subscr2];
}
…然后将当前的
$.when()
更改为

$.when.apply(null, this.raiseEvent('myEvent', args)).done(...
然后将每个延迟的结果传递给
done()
回调,按照对象传递给
$的顺序。when()