2013-05-14 1 views
0

Я не знаю, что происходит с моим кодом. У меня есть Node.js, который запрашивает MySQL db в маршруте и отображает результат для пользователя. Моя проблема заключается в том, как выполнять запросы и блокировать до тех пор, пока запросы не будут выполнены до перенаправления пользователя на запрашиваемую страницу? если добавить предупреждение перед вызовом, функция работает нормально и быстро response..but если предупреждение отключить функцию наклоняет вернуть любое значение, функцию, как замораживание ..Узел js: должен использоваться предупреждение для вызова функции?

этого код пользователя, чтобы запросить значение nodejs

function fred(){ //request function from here to fblue 
    alert('fred called'); //if i disable alert,the function not return any value 
    get('id', function(datmovMar) { 
     var obj = JSON.parse(datmovMar); 
     var items = Object.keys(obj); 
     var output=''; 
     items.forEach(function(item) { 
      output+=obj[item].something+'<br/>'; 
      alert(output); 
     });   
    }); 
} 

function get(id, callback) { 
    $.ajax('http://localhost:8000/' + id + '/', { 
     type: 'GET', 
     dataType: 'json', 
     success: function(data) { if (callback) callback(data); }, 
     error : function()  { if (callback) callback(null); } 
    }); 
} 

и этот код найти в узел JS

fblue(function(datmovMar){ //call function from here 
     res.write(JSON.stringify(datmovMar)); 
     res.end('\n'); 
});  

function fblue(callback){ 
    var query = connection.query('SELECT something from table'), 
     pinMarker = []; 
    query 
    .on('error', function(err) { 
     console.log(err); 
     updateSockets(err); 
    }) 
    .on('result', function(user) { 
     pinMarker.push(user); 
    }) 
    .on('end',function(){ 
     if(connectionsArray.length) { 
      jsonStringx = JSON.stringify(pinMarker); 
      callback(jsonStringx); 
     } 
    }); 
} 

я не знаю, почему, если предупреждение отключить функцию косяк работать нормально?

пожалуйста, помогите ...

благодарит

ответ

1

Вы звоните $.ajax метод JQuery, который будет создать яваскрипт запрос на сервер асинхронно.

Это означает, что поток управления будет продолжаться сразу же после инициирования вызова на ваш сервер.

Так что вы не должны ожидать от fred() функции блокировки до тех пор, пока ваш запрос не будет подан, вместо этого вам необходимо переписать код JavaScript на стороне браузера асинхронным способом.

+0

спасибо .. работает, но когда-нибудь я снова получаю такую ​​же проблему ... может быть, любое другое решение? – ltvie

+0

'var obj = JSON.parse (datmovMar);' вам не нужно анализировать результат, потому что вы указали 'dataType: 'json''. Что вы до сих пор следовали совету KARASZI? –

0

Функция jQuery $ .ajax по умолчанию выполняется асинхронно. Это означает, что запрос не будет заблокирован во время его запуска, поэтому последующие строки кода будут немедленно выполнены. При асинхронных вызовах порядок выполнения не гарантируется.

Вы можете «обмануть» немного здесь и указать вариант асинхронной следующим образом:

$.ajax('http://localhost:8000/' + id + '/', { 
    type: 'GET', 
    dataType: 'json', 
    async: false, 
    success: function(data) { if (callback) callback(data); }, 
    error : function()  { if (callback) callback(null); } 
}); 

Это заставит вызов $ .ajax не возвращаться до тех пор, пока не будет завершено. Однако это не так, как JavaScript, но потому, что вы теряете эффективность, получаемую при асинхронном выполнении. Как заметил другой КАРАСИ, вы должны написать это асинхронно.

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