Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.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'管理同步和异步JavaScript函数;推迟_Javascript_Jquery_Asynchronous_Jquery Deferred - Fatal编程技术网

使用jQuery'管理同步和异步JavaScript函数;推迟

使用jQuery'管理同步和异步JavaScript函数;推迟,javascript,jquery,asynchronous,jquery-deferred,Javascript,Jquery,Asynchronous,Jquery Deferred,我需要通过Socket.IO(客户端)通过WebSocket运行一系列调用。由于我没有使用$.ajax,jQuery的延迟函数也无法集成,因此我必须手动处理承诺。每次调用websocket时,我都会传递一个回调,我很快就会看到这个项目是如何失控的。下面是我的websocket调用如何工作的简化示例(不包括所有连接处理代码): 我将与服务器进行多次对话,所有调用都是异步的,但有些调用需要按特定顺序返回。输入jquerydeferred。以下是一些工作代码: var deferredArray =

我需要通过Socket.IO(客户端)通过WebSocket运行一系列调用。由于我没有使用$.ajax,jQuery的延迟函数也无法集成,因此我必须手动处理承诺。每次调用websocket时,我都会传递一个回调,我很快就会看到这个项目是如何失控的。下面是我的websocket调用如何工作的简化示例(不包括所有连接处理代码):

我将与服务器进行多次对话,所有调用都是异步的,但有些调用需要按特定顺序返回。输入jquerydeferred。以下是一些工作代码:

var deferredArray = [];

$(function(){
    $.when(  // Any order
        getData1(),
        getData2()
    ).then(function(){  // Must have responses from dataCallback1 and dataCallback2 before doing this...
        $.when(  // Any order
            getData3(),
            getData4()
        ).then(function(){  // Must have responses from dataCallback3 and dataCallback4 before doing this...
            getData5();
        });
    });
});

function getData1(){
    js2node('data1', 'something', 'dataCallback1');
    deferredArray[0] = new $.Deferred();
    return deferredArray[0].promise();
}

function getData2(){
    js2node('data2', 'something', 'dataCallback2');
    deferredArray[1] = new $.Deferred();
    return deferredArray[1].promise();
}

function getData3(){
    js2node('data3', 'something', 'dataCallback3');
    deferredArray[2] = new $.Deferred();
    return deferredArray[2].promise();
}

function getData4(){
    js2node('data4', 'something', 'dataCallback4');
    deferredArray[3] = new $.Deferred();
    return deferredArray[3].promise();
}

function getData5(){
    js2node('data5', 'something', 'dataCallback5');
    deferredArray[4] = new $.Deferred();
    return deferredArray[4].promise();
}

function dataCallback1(json){
    // Handle data
    deferredArray[0].resolve();
}

function dataCallback2(json){
    // Handle data
    deferredArray[1].resolve();
}

function dataCallback3(json){
    // Handle data
    deferredArray[2].resolve();
}

function dataCallback4(json){
    // Handle data
    deferredArray[3].resolve();
}

function dataCallback5(json){
    // Handle data
    deferredArray[4].resolve();
}

正如您所看到的,我仍然坚持使用when/then的嵌套回调,并且随着我添加功能,嵌套可能会更加深入。延迟对我来说是一个新概念,但我读过,它应该在这种情况下有所帮助。我觉得应该有比我现在做的更好的方法。有人能帮我更有效地设置它吗?

使用更好的助手函数肯定会有帮助,但您仍然需要使用$.when和$.when来构造调用,然后以正确的顺序执行它们

function doSock(nodeFunction, data) {
    var def = new $.Deferred();
    socket.emit('incoming', nodeFunction, data, function(received) {
        def.resolve(received)
    });
    return def.promise();
}

$(function(){
    $.when(
        doSock('data1', 'something'),
        doSock('data2', 'something')
    ).then(function(data1, data2){
        $.when(
            doSock('data3', 'something'),
            doSock('data4', 'something')
        ).then(function(data3, data4){
            doSock('data5', 'something');
        });
    });
});

你可以用它做更多的事情。然后:

$(function(){
    $.when(
        doSock('data1', 'something'),
        doSock('data2', 'something')
    ).then(function(data1, data2){
        return $.when(
            doSock('data3', 'something'),
            doSock('data4', 'something')
        );
    }).then(function(data3, data4){
        return doSock('data5', 'something');
    });
});
这样你的巢穴永远不会比这更深


(我使用了adeneo的helper方法)

看一看,答案给出了一个如何按顺序执行延迟对象的示例。@Sumit,谢谢,我将不得不尝试一下。我想我从下面的答案中得到了我所需要的,但这也应该有帮助+1,确实,当方法是一种方法时,从$.when返回承诺。很好,这解决了嵌套问题,应该可以帮助团队更好地遵循我的意图!不幸的是,这并不像预期的那样有效。第二个.then(data5)中的“doSock”调用在第二个$.when(data3和data4)中的函数实际给出解析之前执行。事实上,在第二个.then函数(data3,data4)中接收到的变量实际上是来自第一个.then函数(data1,data2)的相同数据!抱歉,我确信这让人读起来很困惑。当我用setTimeout替换套接字请求时,它似乎对我有用:啊,简单地用
替换
。然后用
.pipe
替换
。别忘了返回到
。然后当您升级到1.8时,
谢谢,该助手功能将很好地解决大量冗余问题!我肯定会使用你的答案和凯文的答案的组合。尽管更好地清理了我的代码,但我认为我必须接受Kevin的解决嵌套问题的方法。Grr,希望我能接受这两个!我真的很感谢你的帮助。在实施这一点之后,我确实有一个问题。在第一个“then”实例中,是否有任何类型的保证变量“data1”将来自doSock调用“data1”?换句话说,我在then函数中定义的变量是否总是按照我定义的顺序列出函数(不一定在它们完成时)?这似乎是事实,但我只是想确保依赖于该假设是安全的。是的,数据以$为参数返回的顺序。然后总是与doSock函数等的顺序相同。这样做的话,您就知道结果在哪里,否则将很难管理。好的,很好。再次感谢!
$(function(){
    $.when(
        doSock('data1', 'something'),
        doSock('data2', 'something')
    ).then(function(data1, data2){
        return $.when(
            doSock('data3', 'something'),
            doSock('data4', 'something')
        );
    }).then(function(data3, data4){
        return doSock('data5', 'something');
    });
});