首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步非阻塞模型的故障处理

异步非阻塞模型的故障处理
EN

Stack Overflow用户
提问于 2014-09-25 17:22:30
回答 2查看 42关注 0票数 0

我很难绕过节点的异步模型,我有这样的函数:

代码语言:javascript
复制
function getstream() {

    console.log('calling testAvail, Avail value is:' + available);
    testAvailability();
    console.log('Available:'+available);
    if (available || SelfSharing) {

         // Do something
         setDefaults();

         return;
    }
}

调用testAvailability()函数,定义为:

代码语言:javascript
复制
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变量的值设置之后从它离开的位置继续。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-25 18:59:56

您需要将一个回调传递给testAvailability,然后在socketavailable事件中调用它:

代码语言:javascript
复制
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,并将函数的其余部分移动到该回调中:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-09-25 19:00:02

我们开始:

代码语言:javascript
复制
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);
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26044514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档