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