2014-09-16 5 views
2

Как выполнить синхронизацию результатов в knex db в узле. http://knexjs.org/#Promises-thenКак выполнять запросы синхронизации в knex [Узел]

knex.select('*').from('users').where({name: 'Tim'}) 
    .then(function(id) { 
    console.log('Inserted Account ' + id); 
    }) 

я хочу что-то вроде этого

knex.select('*').from('users').where({name: 'Tim'}) 
    .sync().then(function(id) { 
    console.log('Inserted Account ' + id); 
    }); // code should not continue to run until completing then function 

или

как сделать асинхронной LIB для запуска нескольких параллельных задач и возвращать результаты в коде синхронизации. например, ниже или что-то в этом роде

   var results=async.sync().parallel([ 
        task1,task2 
       ],function(err, res){ 
        results=res; 
       }); // anything like var results or sync() 
       console.log(results); 

ответ

0

Я бы поставил под вопрос вашу потребность запускать вещи в режиме синхронизации. Вероятно, существует некоторый контроль потока, который вы можете установить, и в худшем случае вы можете серьезно повлиять на ваш сервер NodeJS. Из-за однопоточной архитектуры NodeJS вы предлагаете, чтобы все другие события/пользователи подождали, пока текущее действие вызовет БД и не вернется. Это не очень удобно использовать NodeJS.

Из чего я могу сказать по вашему вопросу, что-то вроде async.parallel должно работать на вас.

async.parallel({ 
    queryone: function(parCb){ 
    var query = knex('users').select().where('name', 'Tim'); 
    query.exec(function(err, results) { 
     parCb(err, results); 
    }); 
    }, 
    querytwo: function(parCb){ 
    var query = knex('otherTable').select().where('name', 'Tim'); 
    query.exec(function(err, results) { 
     parCb(err, results); 
    }); 
    }, 
}, 
function(err, results) { 
    //Results are all ready, containing the results of two different queries 
    console.log('Results for queryone: ' + JSON.stringify(results.queryone)); 
    console.log('Results for querytwo: ' + JSON.stringify(results.querytwo)); 
}); 

Здесь, когда вы достигнете function(err,results) обратного вызова, results заполняется данными из двух запросов, выполняя параллельно. Все без полной блокировки ваших других событий.

+0

если есть другая строка после вызова async.parallel, то она будет выполнена до того, как будут сделаны результаты или нет? –

+0

'async.parallel' выполняется асинхронно. Таким образом, вызов сделан, события помещаются в очередь событий, и код перемещается. По мере устранения этих событий (и в этом случае, когда все события разрешаются параллельно), выполняется функция обратного вызова (err, results) ', заполненная результатами! Это характер платформы NodeJS. Обязательно найдите время, чтобы понять, что там делается. , , все работает синхронно - это не правильный подход. – clay

+0

Я знаю об этом, поэтому я хочу async.параллельно возвращать результаты синхронно, но выполнять заданные задачи параллельно. я не хочу запускать код после async.parallel, пока async.parallel не выполнил все задачи и не сделал результатов. –

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