使用jQuery的Deferred管理同步和异步JavaScript函数

无效果

我需要通过Socket.IO(客户端)通过websockets进行一系列调用。由于我没有使用$ .ajax,因此jQuery的延迟函数也不会集成,因此我必须手动处理promises。每次进行websocket调用时,我都会传递一个回调,并且我很快就知道该项目可能会失控。这是我的websocket调用工作方式的简化示例(不包括所有连接处理代码):

function js2node(nodeFunction, data, callback){
    socket.emit('incoming', nodeFunction, data, callback);
}

function sampleServerCall(){
    js2node('sampleCall', 'something', 'sampleCallback');
}

function sampleCallback(json){
    // Handle data
}

sampleServerCall();

我将与服务器进行大量交谈,所有调用都是异步的,但有些调用需要以特定顺序返回。输入jQuery延迟。这是一些工作代码:

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时,我仍然对嵌套回调感到困惑,而在添加功能时嵌套可能会更深。对我来说,Deferred是一个新概念,但我已经读过它在这种情况下应该会有所帮助。我觉得必须有一种比我目前正在做的更好的方法。谁能帮助我更有效地进行设置?

凯文·B

您可以使用.then进行更多操作:

$(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的辅助方法)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

同步函数和异步延迟jQuery对象的混合

来自分类Dev

JavaScript函数是同步还是异步?

来自分类Dev

JavaScript函数是同步的还是异步的?

来自分类Dev

使用dispatch_sync和dispatch_async同步对嵌套异步函数的调用

来自分类Dev

混合同步和异步javascript / jquery,最后获得成功功能

来自分类Dev

在JavaScript中异步函数的末尾运行同步函数?

来自分类Dev

使异步函数同步的后果

来自分类Dev

使mongoskin函数是异步同步的

来自分类Dev

同步迭代异步函数

来自分类Dev

异步函数停止同步函数

来自分类Dev

为什么仅调用同步函数时javascript promises异步?

来自分类Dev

JavaScript函数同步抓取HTML和JS

来自分类Dev

从异步函数返回true / false以在同步if()中使用

来自分类Dev

jQuery.ready()函数和异步CSS

来自分类Dev

等待JS函数中的异步调用结束。(jQuery.Deferred吗?)

来自分类Dev

异步函数中的同步异常

来自分类Dev

Javascript闭包和异步函数参数

来自分类Dev

Javascript范围,内联函数和异步操作

来自分类Dev

如何在正确的时间使用异步和同步编程

来自分类Dev

使用 javascript、Chart.js 和使用 json 在函数中同步两个数据

来自分类Dev

在jquery中使用Deferred / When延迟函数的问题

来自分类Dev

jQuery Deferred无法与getJSON调用异步执行

来自分类Dev

了解同步和异步操作

来自分类Dev

了解同步和异步操作

来自分类Dev

合同异步和同步代码

来自分类Dev

签名异步。和同步方法

来自分类Dev

使用jQuery延迟链接异步函数

来自分类Dev

使用jQuery延迟链接异步函数

来自分类Dev

从同步函数中调用异步函数