2012-03-10 3 views
7

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

function authenticate(userid, hash) 
{ 
    mysql_client.query("SELECT `hash` FROM `auth` WHERE `userid` = " + userid, function selectCb(err, results, fields) { 
    if (err) 
    { 
     client.send("Error communicating with mysql, please retry your request"); 
     return false; 
    } 

    if(results.length == 0 || results[0].hash != hash) 
    { 
     client.send("Error comparing authentication data with database, please retry request"); 
     return false; 
    } 

    return true; 
} 
); 
} 

Я хочу, чтобы иметь возможность вернуть эти значения из функции Authenticate() сам, а не внутренняя анонимной функции selectCb и имею аутентификации блока до обратного вызова не будет завершен. Как я могу это сделать?

ответ

13

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

function authenticate(user, pass, callback) { 
    mysql_client.query("...", function (err, results, fields) { 
     if (err) { 
      callback("Error communicating ..."); 
     } else if (results.length ...) { 
      callback("Error comparing authentication..."); 
     } 
     callback() 
    }); 
}); 

Пример использования:

authenticate('jim', '123456', function (err) { 
    if (err) { 
     alert(err); 
    } else { 
     alert('Welcome'); 
    } 
}); 
+0

Спасибо, это, кажется интересным решением, однако я еще немного не знаете, как получить значение из этого. Скажем, я хочу, чтобы запрос остановился на этом этапе, если аутентификация завершилась неудачно, в противном случае продолжить приложение. Кажется, что все, что я верну в этом обратном вызове, будет съедено, так как обратные вызовы возвращают значение, поэтому я не смог бы просто вернуть true/false из этого. Как мне это сделать? –

+0

@majicbunnie, если одна часть вашего потока приложений асинхронна, что делает весь асинхронный асинхронный процесс, и вам нужно иметь обратные вызовы, подобные этому, до конца. Чтобы упростить это и сделать ваш код более удобным для работы, вы должны взглянуть на концепцию «фьючерсы» или «обещания». Это избавляет вас от создания безумно-глубоко вложенных обратных вызовов. Если вы его ищете, есть много информации, но вы можете начать здесь: http://howtonode.org/promises – nickf

+0

То же самое с OP. Без использования обещаний или тому подобного, как можно было бы вернуть эти значения из самой функции authenticate(), используя простую программу? Я мог понять решение, но я смутил пример использования. Не похоже, что он отвечает на вопрос OPs. – jagc

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