Как вернуть код состояния из функции в Node.js - PullRequest
1 голос
/ 21 ноября 2011

У меня есть такая функция:

function getStatusCode(site){
    var options = {
        host: "127.0.0.1",
        port: 8000,
        path: site,
        headers: {
                    Host: site
            }
        };

    var status;

    http.get(options, function(response) {
        status=response.statusCode;
    });
    return status;
} 

Как вернуть статус, только когда http.get закончит работу, или вернет ноль, если время ожидания (например, 10 секунд)?

Ответы [ 3 ]

10 голосов
/ 21 ноября 2011

Вся идея node.js заключается в его асинхронной природе.То, что вы пытаетесь сделать, - это нарушить шаблон проектирования, который лежит в его основе, пытаясь сделать его синхронным.

Из-за асинхронного характера метода get вы не можете сделать это.Вы можете манипулировать кодом состояния только внутри функции обратного вызова.Таким образом, ваш getStatusCode не нужно ничего возвращать.Вы можете сделать так, чтобы он принимал дополнительный параметр, который будет представлять обратный вызов, вызванный после того, как станут доступны результаты:

function getStatusCode(site, callback) {
    var options = {
        host: "127.0.0.1",
        port: 8000,
        path: site,
        headers: {
            Host: site
        }
    };

    http.get(options, function(response) {
        callback(response.statusCode);
    });
}

и затем:

getStatusCode('http://...', function(statusCode) {
    alert(statusCode);
});
2 голосов
/ 21 ноября 2011

Предлагаемые подходы плохо масштабируются, особенно если вам нужна обработка ошибок: в сложных случаях вы получите спагетти с лямбдами. Таким образом, приведенные выше примеры должны рассматриваться как учебник начального уровня и не должны использоваться в производстве.

Вы можете использовать return для асинхронного возврата значений, но вы должны возвращать не значение, а какое-то продолжение. Фьючерсы и обещания являются одним из примеров таких продолжений. Ищите библиотеки NPM, предоставляющие их. См. q и q-http библиотеки для примера.

См. Также следующие связанные вопросы:

В чем выгода абстракции 'обещания' в CommonJS?

Понимание обещаний в node.js

Я думаю, что q библиотека отличается тем, что в ней есть родственные библиотеки (q-io, q-http), реализующие большую часть стандартной библиотеки node.js с использованием обещаний.

На самом деле ранняя стандартная библиотека для узлов использовала обещания, но позже они решили использовать обратные вызовы. Это было не потому, что обещания не были хорошими, а потому что обратные вызовы более низкого уровня.

1 голос
/ 21 ноября 2011

Вы не можете «вернуть» его как таковое, так как для этого потребуется функциональный блок ввода-вывода, а это узел нет нет. Вместо этого вы можете передать ему функцию обратного вызова, которая будет вызываться с вашим кодом состояния.

function getStatusCode(site, callback){
    var options = {
        host: "127.0.0.1",
        port: 8000,
        path: site,
        headers: {
            Host: site
            }
        };

    var status;

    http.get(options, function(response) {
        status=response.statusCode;
        callback(status);
    });
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...