2013-09-20 4 views
0

Кто-нибудь знает, как ждать потока в javascript?wait for javascript thread

var resultList = new Array(); 

function query(){ 
    //more stuff 
    service.nearbySearch(request, callback); //<-- this is the thread 

    console.log(resultList);  //<-- still empty array 

    setTimeout(function() { 
     console.log(resultList); //<-- array filled (after hardcoded timeout) 
    }, 1000); 

} 

function callback(results, status) { 
    //... 
    resultList.push(resultObject); 
} 

делать с логикой программы, обращение с resultList не возможно внутри функции обратного вызова. Он должен находиться в «родительском» (функция запроса). Таким образом, мне нужно как-то ждать потока (и так для заполнения массива), потому что я могу продолжать и передавать результат.

Так что мой вопрос. Является ли любой метод .join() похожим на java? или waitpid(), как в Unix? или какова наилучшая практика, чтобы дождаться завершенной задачи?

Отношения

+0

В javascript не существует нити. Вышеприведенный код не делает то, что вы думаете. 'callback' вызывается в том же потоке. – cgTag

+0

Поместите 'console.log (resultList)' в ваш обратный вызов? – h2ooooooo

+0

Вместо var resultList = new Array(); вы должны написать var resultList = []; Вы можете использовать Google, чтобы узнать почему. – frenchie

ответ

0

Javascript все выполнено в той же теме. Это , блокирующий поток, который остановит браузер от обновления DOM до тех пор, пока он не вернется в браузер.

Вот почему файлы Javascript должны быть включены в нижней части HTML-страниц.

Проблема заключается в том, что service.nearbySearch выполняет запрос AJAX или REST серверу, и ответ является асинхронным (это произойдет позже).

Вам необходимо переместить свою логику для обработки ответа на обратный вызов.

var resultList = new Array(); 

function query(){ 
    service.nearbySearch(request, function(results, status) { 
     callback(results, status); 
     console.log(resultList); 
    }); 
} 

function callback(results, status) { 
    //... 
    resultList.push(resultObject); 
}