我很难绕过节点的异步模型,我有这样的函数:
function getstream() {
console.log('calling testAvail, Avail value is:' + available);
testAvailability();
console.log('Available:'+available);
if (available || SelfSharing) {
// Do something
setDefaults();
return;
}
}调用testAvailability()函数,定义为:
function testAvailability()
{
console.log('entered test');
var stat;
var socket = io.connect('http://somedomain.com');
socket.on('error', function() {
console.log('There was an error at server end please try again');
// chrome.runtime.reload();
setTimeout(chrome.runtime.reload(),3000);
//here i change options
//socket = io.connect(host, options);
});
socket.emit('available');
socket.on('available', function (status) {
console.log('got status from server which is:'+ status);
available=status;
console.log("inside the socket.on"+available);
console.log('leaving test, do you see any got status above?');
});
}我希望getstream()在完成testAvailability()和available变量的值设置之后从它离开的位置继续。
发布于 2014-09-25 18:59:56
您需要将一个回调传递给testAvailability,然后在socket的available事件中调用它:
function testAvailability(callback)
{
console.log('entered test');
var stat;
var socket = io.connect('http://somedomain.com');
socket.on('error', function() {
console.log('There was an error at server end please try again');
// chrome.runtime.reload();
setTimeout(chrome.runtime.reload(),3000);
//here i change options
//socket = io.connect(host, options);
});
socket.emit('available');
socket.on('available', function (status) {
console.log('got status from server which is:'+ status);
available=status;
console.log("inside the socket.on"+available);
console.log('leaving test, do you see any got status above?');
callback(); <-- CALL YOUR CALLBACK FUNCTION HERE
});
}然后更改您的getstream函数,以便它将一个回调传递给testAvailability,并将函数的其余部分移动到该回调中:
function getstream() {
console.log('calling testAvail, Avail value is:' + available);
testAvailability(function() {
console.log('Available:'+available);
if (available || SelfSharing) {
// Do something
setDefaults();
}
});
}有几件事要注意:
getstream现在是异步的。如果有其他东西在等待它完成,则需要对其进行更改,以便它也接受一个回调函数。socket的error事件中进行某种重试。在这种情况下,这可能是可以的,这取决于您的应用程序,但通常情况下,当发生错误时,您希望将错误作为回调的第一个参数。发布于 2014-09-25 19:00:02
我们开始:
function getstream() {
console.log('calling testAvail, Avail value is:' + available);
testAvailability(function(available){
console.log('Available:'+available);
if (available || SelfSharing) {
// Do something
setDefaults();
return;
}
});
}
function testAvailability(callback) {
console.log('entered test');
var stat;
var socket = io.connect('http://somedomain.com');
socket.on('error', function() {
console.log('There was an error at server end please try again');
// chrome.runtime.reload();
setTimeout(chrome.runtime.reload(),3000);
//here i change options
//socket = io.connect(host, options);
callback(false);
});
socket.emit('available');
socket.on('available', function (status) {
console.log('got status from server which is:'+ status);
console.log('leaving test, do you see any got status above?');
callback(true);
});
}https://stackoverflow.com/questions/26044514
复制相似问题