2014-09-25 72 views
0
我在与周围节点的异步模型越来越麻烦

,我有这样的功能:故障处理异步非阻塞模式

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变量设置了它的值。

回答

0

你需要一个回调传递给testAvailability然后调用它socketavailable事件中:

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(); 
     } 
    }); 
} 

几件事情需要注意:

  1. getstream现在是异步的。如果有其他事情正在等待它完成,则需要对其进行更改,以便还需要回调函数。
  2. 我看到你在socketerror事件中做某种重试。在这种情况下,这可能是正确的,它取决于您的应用程序,但通常,您会希望在发生错误时将错误作为回调的第一个参数传回。
+0

真周到的你添加的最后2分,我会在坑我敢肯定,感谢一直下降。 – 2014-09-25 19:53:23

0

这里,我们去:

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); 
    }); 
}