2015-03-31 2 views
0

Следующий код предназначен для создания объекта из списка слов.Функция в javascript не ведет последовательно

var buildDictionary = function() { 
    console.log("Buildling Dictionary"); 
    console.log(masterList); 
    var word, vowelString, dict = {}; 
    for (var i = 0; i < masterList.length; i++) { 
    word = masterList[i][0]; 
    vowelString = getVowels(masterList[i]); 
    console.log(vowelString); 
    if (dict[vowelString] == undefined) 
     dict[vowelString] = [word]; 
    else 
     dict[vowelString].push(word); 
    } 
    return dict; 
} 
var dictionary = buildDictionary(); 

При запуске как есть словарь представляет собой пустой объект. Однако, если я вручную вызвать его ...

dictionary = buildDictionary(); 

Он работает, как ожидалось!

Полный код, при необходимости, можно найти здесь https://jsfiddle.net/4yts4uvr/

+1

'Run as is', что вы подразумеваете под этим? Чтобы выполнить функцию, вы должны ее вызвать. – mohamedrias

+0

В вашей скрипке вы загружаете данные через ajax, который является асинхронным. Непосредственно после запуска buildDictionary, в этот момент данные еще не вернутся. Вам нужно построить словарь в своем обратном вызове ajax. –

+0

Что я имею в виду, когда я просто загружаю свою страницу в браузере. Он запускает весь мой код, но на самом деле он не создает словарь. Затем, если я перейду на консоль и вручную наберю 'dictionary = buildDictionary();' он THEN создает словарь. – Steven

ответ

1

В вашем jsfiddle masterList загружается с помощью Ajax, вам нужно создать свой словарь в обратный вызов.

$.ajax({ 
    type: "GET", 
    url: "../data/cmudict-0.7b" 
}).success(function(content) { 
    // do stuff with content 
}).then(function() { 
    // make your second ajax call (or look at jQuery.when) 
    $.ajax({ 
     type: "GET", 
     url: "../data/cmudict-0.7b.phones" 
    }).success(function(content) { 
     // do stuff with content 
    }).then(function() { 
     var dictionary = buildDictionary(); 
    }); 
}); 

Таким образом, вы убедитесь, что у вас есть все данные, необходимые до работы вашей функции buildDictionary.

Вы можете выполнять синхронные запросы HTTP (блокирование), однако они не рекомендуются, когда выполняются в основном потоке:

Примечание: Начиная с Gecko 30,0 (Firefox 30.0/Thunderbird 30.0/SeaMonkey 2,27), синхронных запросов на основной поток устарели из-за негативных последствий для пользователя.

+0

Означает ли это, что, как только я использую AJAX, я в принципе ничего не могу сделать синхронно? Означает ли это, что весь мой код должен быть внутри вызова ajax для всей программы? – Steven

+0

@Steven Обновлен мой ответ, чтобы отразить ваш комментарий –

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