我需要通过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是一个新概念,但我已经读过它在这种情况下应该会有所帮助。我觉得必须有一种比我目前正在做的更好的方法。谁能帮助我更有效地进行设置?
您可以使用.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] 删除。
我来说两句