2012-01-22 4 views
0

Я часто сталкиваются с проблемами в плане дизайна, если дело доходит до этой точки:Избежание локальные переменные

var pages, 
    book 
; 

Book.findOne({ title: "First Book" }, function(err, doc) { 
    pages = doc.pages; 

    console.log(pages); 
}); 

res.json(pages, 200); 

pages не определен, хотя я поставил его в doc.pages. Если я переведу res.json(pages, 200) в обратный вызов findOne, этот скрипт отлично работает.

Я следую неправильному шаблону/кодовому дизайну, когда дело доходит до JavaScript, или есть решение оставить res.json() вне callback, помимо создания pages глобального?

ответ

6

Проблема в том, что вы передаете Book.findOne обратный вызов, который должен быть выполнен, когда найдено совпадение. Впоследствии вы вызываете res.json и передаете ему pages в качестве аргумента. Важно понимать, что к этому времени обратный вызов не будет выполнен. Можете ли вы переместить ответ внутри функции обратного вызова?

Book.findOne({title: 'First Book'}, function (err, doc) { 
    res.json(doc.pages, 200) 
}) 
+0

Да, это прекрасно. Я уже предполагал, что это более распространенное использование patten в Javascript для работы через Callbacks, так как код выполняется asynchroniosly, а не строго из одной строки в другую. Код –

+1

@ daemonfire300 не выполняется асинхронно. Обратные вызовы называются асинхронно. – fent

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