【问题标题】:Return value, or stop script返回值,或停止脚本
【发布时间】:2014-03-08 02:16:31
【问题描述】:

嘿嘿, 我在 Windows Azure Mobile 服务中创建 API,在这个 api 脚本中我有连接其他服务的功能。当我从服务中得到很好的答案时,我遇到了如何返回值或停止可执行我的脚本的问题。函数process.exit(1),不起作用。

    function function1(item,response) {
    var buf ='';
    var net = require('net');
    var HOST = 'xxxx.xxxx.xxxx.xxxx';
    var PORT = xxx;

    var client = new net.Socket();

    client.setTimeout(100000, function() {
        console.log("Timeout");
        response.send(500, "Timeout");
    });

    client.connect(PORT, HOST, function() {
        client.write(item + "\n");
        client.on('data', function(data) {
            buf = buf + data.toString('utf-8');         
        });

        client.on('close', function() {
        });

        client.on('end', function() {
            if (buf.length > 1) {    
                    var result = JSON.parse(buf);
                    //if resulr.Aviable is true the functios should return result or     send result and stop execiuting script
                    if ( result.Avaiable) {
                         response.send(200, result);
                         //now i wont't to respond answer to client or return my value(result)
                         console.log('Send data');                         
                    }
            }           
             client.destroy();             
        });                                      
    });  

    }

【问题讨论】:

  • 你的代码中有 response.send ,那不是返回你的结果吗?您期望发生的事情没有发生?
  • 但如果我将response.send 更改为return result。函数返回未定义的参数。

标签: node.js azure azure-mobile-services


【解决方案1】:

另一种方法是使用一个标志来指示是否已发送响应。这样,当达到第一个备选方案时,您可以将标志设置为 true(可能清除超时,使其不会超过所需的时间),并在所有情况下检查标志是否已设置,然后再返回响应.类似于下面的代码行:

function function1(item,response) {
    var buf = '';
    var net = require('net');
    var HOST = 'xxxx.xxxx.xxxx.xxxx';
    var PORT = xxx;

    var client = new net.Socket();

    var responseSent = false;

    var timeoutHandler = client.setTimeout(100000, function() {
        if (!responseSent) {
            responseSent = true;
            console.log("Timeout");
            response.send(500, { error: "Timeout" });
        }
    });

    client.connect(PORT, HOST, function() {
        client.write(item + "\n");
        client.on('data', function(data) {
            buf = buf + data.toString('utf-8');         
        });

        client.on('close', function(had_error) {
            if (!responseSent) {
                clearTimeout(timeoutHandler);
                responseSent = true;
                console.log('Socket closed');
                response.send(500, { error: had_error ? 'Socket error' : 'unknown' });
            }
        });

        client.on('end', function() {
            if (!responseSent) {
                responseSent = true;
                clearTimeout(timeoutHandler);
                if (buf.length > 1) {
                    try {
                        var result = JSON.parse(buf);
                        if (result.Available) {
                            response.send(200, result);
                        } else {
                            response.send(500, { error: 'Socket data is not available' });
                        }
                    } catch (ex) {
                        response.send(500, { error: 'error parsing JSON', exception: ex });
                    }
                } else {
                    // We should always return a response
                    response.send(500, { error: 'No data read from socket' });
                }
            }
            client.destroy();             
        });
    });
}

请注意,由于 node.js 在单线程上运行,您可以假设不会出现响应被发送两次的情况。此外,您应该确保始终发送一次响应 - 在您拥有的代码中,如果出现套接字错误,或者如果 buf.length 不大于 1,或者如果 result.Avaiable 不正确,则超时响应将被发送,但您无需等待整个(100 秒)时间来发送该响应。

【讨论】:

  • 谢谢,但这并不能解决我的问题,因为我在其他函数中使用循环中的这个函数。当function1有result.Avaiable == true时,我需要停止我的循环。
  • 在这种情况下你不能在这个函数中发送响应;取而代之的是该函数的另一个参数是回调函数,并使用结果调用该回调。然后在你有循环的另一个函数的代码中,你将使用“responseSent”逻辑实现回调。
猜你喜欢
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2017-09-04
相关资源
最近更新 更多