2014-05-08 3 views
2

Я хочу использовать NodeJS для чтения 60 тыс. Записей из базы данных MySQL и записи их в базу данных ArangoDB. Позднее я буду использовать функции агрегации ArangoDB и т. Д. Для обработки моего набора данных.NodeJS с arangojs и синхронизацией: все после .sync() игнорируется?

Исходя из PHP, где сценарий обычно работает синхронно, и поскольку я считаю, что это имеет смысл здесь, моя первоначальная (наивная) попытка заключалась в том, чтобы заставить мой NodeJS-скрипт запускать синхронизацию. Однако он не работает должным образом:

Я печатаю на консоль, вызываю функцию через .sync(), чтобы подключиться к серверу ArangoDB и распечатать все существующие базы данных, а затем снова распечатать на консоли. Но все, что находится под вызовом синхронизации для моей функции ArangoDB, полностью игнорируется (не печатает на консоль снова, и, похоже, что-то здесь не работает).

Что я могу увидеть? Делает ли .done() в функции, вызванной через .sync(), вызывает проблемы?

var mysql = require('node-mysql'); 
var arango = require('arangojs'); 
//var sync = require('node-sync'); // Wrong one! 
var sync = require('sync'); 


function test_arango_query() { 
    var db = arango.Connection("http://localhost:8529"); 
    db.database.list().done(function(res) { 
     console.log("Databases: %j", res); 
    }); 
    return "something?"; 
} 

sync(function() { 
    console.log("sync?"); 
    var result = test_arango_query.sync(); 
    console.log("done."); // DOES NOT PRINT, NEVER EXECUTED?! 
    return result; 

}, function(err, result) { 
    if (err) console.error(err); 
    console.log(result); 
}); 

ответ

2

Ваша функция test_arango_query не использует обратный вызов. sync работает только с функциями, использующими обратный вызов. Он должен знать, когда данные готовы вернуть его с .sync(), если ваша функция никогда не вызывает обратный вызов, то sync никогда не сможет вернуть результат.

Update ваша функция, чтобы вызвать функцию обратного вызова, если вы хотите, чтобы вернуться:

function test_arango_query(callback) { 
    var db = arango.Connection("http://localhost:8529"); 
    db.database.list().done(function(res) { 
     console.log("Databases: %j", res); 
     callback('something'); 
    }); 
} 
+0

Имеет смысл и был один легко исправить. Спасибо огромное! Ваше объяснение должно быть первым абзацем «sync' readme, действительно. Кажется, что не хватает основных примеров, которые фокусируются на основной концепции. – CoDEmanX

+0

Интересно, почему NodeJS заканчивается сразу после запроса arangodb с использованием моего исходного кода. Если моя функция 'test_arango_query()' никогда не возвращается, и она называется синхронной, не должно ли это делать NodeJS навсегда? – CoDEmanX

+1

@CoDEmanX Ваша функция возвращает. Он возвращается сразу же, путь до завершения запроса. Если вы хотите знать, когда эти данные готовы, вам нужно использовать «обратный вызов», и из-за этого я не думаю, что библиотека 'sync' много делает для вас. 'node.js' разработан как очень асинхронный, и это здорово! С языком, подобным PHP, у вас есть определенное количество процессов, скажем, 20, и если они все ждут ожидаемого медленного запроса, тогда другие виды использования не могут даже загружать простые страницы. – Paulpro