2015-09-28 2 views
1

Я постараюсь сделать это как можно проще. Кажется, что следующая функция работает очень странно. Результат, который я получаю от своих тестовых отпечатков, составляет порядка 1, 4, 3, 2 (с пустым возвратом).Линии, запускаемые в странном порядке

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

var server = new mongo.Server('localhost', 27017); 
var db = new mongo.Db('tdp013', server); 

app.get('/getall', function (req, res) { 

    var returnList = []; 
    console.log("1"); 

    db.open(function(err, client){ 
     client.collection("messages", function(err, col){ 
      col.find({}, function(err, cursor){ 
       cursor.each(function(err, item){ 

        if(item!=null){ 
         console.log("2"); 
         returnList.push(item); 
        } 

       }); 
       console.log("3"); 
      }); 
     }); 
    }); 
    console.log("4"); 
    console.log(returnList); 
    res.sendStatus(200); 
}); 

Мой вопрос просто так, есть хорошее объяснение (в отсутствии лучшего слова), почему/как эти линии не становятся выполняется в письменном порядке?

Или, альтернативно, есть способ вернуть returnList, не делая этого на итерации?

+0

Поскольку вы добавили 'console.log (" 2 ");' и 'console.log (" 3 ");' в функцию обратного вызова, поэтому эти строки выполняются при выполнении этого метода. И 'console.log (" 4 ");' не будет ждать метода 'db.open'. Будет результат 1, 4, 3, 2. – deepakb

ответ

1

Это просто асинхронный характер, который node.js еще более укрепляет с помощью JavaScript.

Вы пытаетесь прочитать этот код и причину через его выполнение последовательно (то есть синхронно), но это не так, как это работает.

console.log('1'); 

db.open(function (err, db) { 
    // ... 
}); 

console.log('4'); 

Возьмите вышеупомянутый фрагмент, например. ВыОжидайте функции в db.open(), чтобы завершить работу до того, как она перейдет к записи 4 на консоль, но это совсем не так. Что происходит, так это то, что узел будет асинхронно запускать этот метод open() и перейти к следующему коду (здесь это будет console.log('4');). Когда этот метод open() завершит работу, он запустит функцию обратного вызова, определенную в списке параметров.

Это асинхронный JavaScript. Вы не можете ожидать, что он будет запускать код в редакторе синхронно/последовательно написанным следующим образом.

Развитие логики, которая будет течь путь (появляется) вы хотите, чтобы течь, она должна была бы быть переработан, как в следующем:

var server = new mongo.Server('localhost', 27017); 
var db = new mongo.Db('tdp013', server); 

app.get('/getall', function (req, res) { 

    var returnList = []; 
    console.log("1"); 

    db.open(function(err, client){ 
     client.collection("messages", function(err, col){ 
      col.find({}, function(err, cursor){ 
       cursor.each(function(err, item){ 

        if(item!=null){ 
         console.log("3"); 
         returnList.push(item); 
        } 
        else { 
         console.log("4"); 
         console.log(returnList); 
         res.sendStatus(200); 
        } 

       }); 
       console.log("2"); 
      }); 
     }); 
    }); 
}); 
+0

Я думаю, что понимаю, что вы имеете в виду, я должен иметь просто не осознавали, что даже сами функции не являются синхронными. Спасибо за вашу помощь! –

0

Node.js асинхронный характер и работает на однопоточный цикл событий.

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

Асинхронный в точности противоположный этому. Пока вы выполняете запрос к базе данных, Node.js будет продолжать выполнять код, и когда запрос базы данных будет выполнен, он вернется к его обработке.

Итак, в вашем случае вы добавили console.log("2"); и console.log("3"); в функцию обратного вызова, поэтому эти строки выполняются при выполнении этого метода. И console.log("4"); не будет ждать завершения db.open. Следовательно, результаты 1, 4, 3, 2.

Так, чтобы убедиться, что returnList возвращает правильные данные, вы должны добавить это в свой метод обратного вызова.

Надеюсь, это поможет вам понять проблему, с которой вы сталкиваетесь.

Смежные вопросы