2013-10-02 3 views
0

Как хранить информацию в массиве в javascript, которую я извлек из текстового файла для последующего использования? Я использую его для размещения HTML-кода, но также для того, чтобы реагировать на пользователя. В настоящее время я могу поместить HTML просто отлично с помощью встроенных вызовов функций, но я хочу, чтобы данные, чтобы использовать позже ...не может получить доступ к var вне функции get

function get_words() { 
    var words = new Array(); 
    var sylls = new Array(); 
    var csv_file = new Array(); // for word arrays 

    $.get('terms.csv', function(data){ 
     csv_file = data.split('\n'); 
     // csv file is now in an array, split into seperate word array and syllable array 
     for (var i = 0; i < csv_file.length; i++) { 
      var both = csv_file[i].split(','); // split at the comma 
      words[i] = both[0]; // populate word array 
      sylls[i] = both[1]; // populate syllable array 
      put_word(words[i], sylls[i]); 
     }; 
     check_resize(); 
    }); 
} 

function put_word(word, sylls) { 
    console.log(word); 
    // place the words into 'words' div 
    var divID = document.getElementById("words"); // grab 'words' div 
    divID.innerHTML += "<span>" + word + "</span>" + "<sup>" + sylls + "</sup> "; 
} 

Вот код, который я есть. Я бы хотел, чтобы слова [] и sylls [] были доступны вне этой функции get.

EDIT: Позвольте мне быть более ясным (oops). Неважно, где я объявляю свои массивы. Причина, по которой я это знаю, заключается в том, что я могу разместить их в верхней части моего скрипта (вне функции), а в конце get_words() попробуйте console.log (слова), и это будет пустой массив.

var words = new Array(); 
var sylls = new Array(); 
var csv_file = new Array(); // for word arrays 

$(document).ready(function(){ 
    get_words(); 
}); 


function get_words() { 


    $.get('terms.csv', function(data){ 
      csv_file = data.split('\n'); 
       // csv file is now in an array, split into seperate word array and syllable array 
       for (var i = 0; i < csv_file.length; i++) { 
        var both = csv_file[i].split(','); // split at the comma 
        words[i] = both[0]; // populate word array 
        sylls[i] = both[1]; // populate syllable array 
        //put_word(words[i], sylls[i]); 
       }; 
       check_resize(); 
     }); 
    console.log(words); 

} 

EDIT: Может ли кто-нибудь сказать мне, где поставить обратный вызов ??

function get_words() { 


    $.get('terms.csv', function(data){ 
      csv_file = data.split('\n'); 
       // csv file is now in an array, split into seperate word array and syllable array 
       for (var i = 0; i < csv_file.length; i++) { 
        var both = csv_file[i].split(','); // split at the comma 
        words[i] = both[0]; // populate word array 
        sylls[i] = both[1]; // populate syllable array 
        //put_word(words[i], sylls[i]); 
       }; 
     }); 

} 

Так что ... если я хочу подождать, пока после того, как этот файл был введен в массив, а затем вызвать другую функцию, как я могу это сделать?

+3

Проще говоря 'words' и' sylls' instanciations вне 'get_words' функции –

+0

Do вы имеете в виду вне 'get' или вне' get_words'? –

+0

Я не уверен, что вы имеете в виду, но здесь нужно либо определить массивы вне функции, и если это не то, что вы имеете в виду, возможно, вы хотите сохранить строки в какой-либо сессии, как объект, я бы предложите использовать cookie, если это просто JS – theBigChalk

ответ

0
var words = [], sylls = [], csv_file=[]; 
function get_words(){ ... } 
function put_word(){ ... } 

function needs_words_and_sylls(){ .... } 
+0

Не имеет значения, где я размещаю массивы, они возвращаются как пустые. – prismspecs

+0

Они не будут пустыми, если завершение успешного завершения $ .get() завершается, если предположить, что оно заполняет их. Пока этот обратный вызов не будет выполнен, они будут находиться в неопределенном состоянии. –

+0

Итак, как мне сделать что-то только после завершения $ .get()? Никто не может дать мне ответ на этот вопрос. O_O – prismspecs

0

В областях javascript создаются и привязываются только к функции, которая их содержит.

Для вашего случая переменная words создана в рамках функции get_words и будет доступна только внутри функции get_words. Чтобы позволить двум или более функциям получать доступ к одной и той же области действия, они должны быть определены в той же области.

Также для вашего дела ваши обе функции, как представляется, определяется в глобальном масштабе, поэтому переменные, которые вы хотите, чтобы быть доступными для обеих ваших функций, должна быть определена в глобальном масштабе также:

var words = new Array(); 
    var sylls = new Array(); 
    var csv_file = new Array(); // for word arrays 

function get_words() { 


    $.get('terms.csv', function(data){ 
     csv_file = data.split('\n'); 
     // csv file is now in an array, split into seperate word array and syllable array 
     for (var i = 0; i < csv_file.length; i++) { 
      var both = csv_file[i].split(','); // split at the comma 
      words[i] = both[0]; // populate word array 
      sylls[i] = both[1]; // populate syllable array 
      put_word(words[i], sylls[i]); 
     }; 
     check_resize(); 
    }); 
} 

function put_word(word, sylls) { 
    console.log(word); 
    // place the words into 'words' div 
    var divID = document.getElementById("words"); // grab 'words' div 
    divID.innerHTML += "<span>" + word + "</span>" + "<sup>" + sylls + "</sup> "; 
} 
+0

Извините, я должен был быть более ясным. Я понимаю переменную область, я вставил версию экспериментального кода. Неважно, где я размещаю массивы, они возвращаются как пустые. – prismspecs

+0

Это состояние гонки, когда вы вызываете console.log (слова); вызов ajax, который будет заполнять слова, еще не закончен. Поверьте мне после завершения ajax-вызова, слова заполнены и доступны –

+0

Как проверить массив слов сразу после вызова? – prismspecs

1
var words = []; 
var sylls = []; 
function get_words() { 
    $.get('terms.csv', function(data){ 
     // Clear the result arrays 
     words = []; 
     sylls = []; 
     var csv_file = data.split('\n'); 
     // csv file is now in an array, split into seperate word array and syllable array 
     for (var i = 0; i < csv_file.length; i++) { 
      var both = csv_file[i].split(','); // split at the comma 
      words[i] = both[0]; // populate word array 
      sylls[i] = both[1]; // populate syllable array 
      put_word(words[i], sylls[i]); 
     }; 
     check_resize(); 
    }); 
} 
+0

Не имеет значения, где я размещаю массивы, они возвращаются как пустые. – prismspecs

+0

Вы смотрите на них сразу после вызова 'get_words'? Поскольку он использует AJAX, назначение выполняется асинхронно, поэтому переменные не обновляются при возврате функции. – Barmar

+0

Ах, ладно, так как я могу сделать это полезным? Я имею в виду, что мне хорошо, если я не могу получить доступ к массиву, который только что создал? – prismspecs

0

Есть несколько вещей, которые вы можете сделать, либо переместить переменные из функции, как это:

var words = new Array(); 
var sylls = new Array(); 
var csv_file = new Array(); // for word arrays 
function get_words() { 
    //code here 
} 

Или вы можете просто добавить переменную в качестве оконного объекта

function get_words() { 
    window.words = new Array(); 
    window.sylls = new Array(); 
    window.csv_file = new Array(); // for word arrays 
} 

Я также помню, что могу просто определить переменную без «var», и она становится глобальной, как и окно. Дай мне знать, если это работает.

function get_words() { 
    words = new Array(); 
    sylls = new Array(); 
    csv_file = new Array(); // for word arrays 
} 
+0

Хотя # 1, вероятно, помогает OP, я бы предупредил о # 2 и # 3. # 2 создает глобальные объекты, что может быть нежелательно в случае OPs. Насколько нам известно, его фрагмент кода завернут в другую функцию (например, «готовность» jQuery), которая НЕ создавала бы глобальные переменные. # 3 является опасным, поскольку он может или не может создавать глобальные переменные. Если в цепочке видимости есть другая переменная 'words', она будет перезаписана. – Steve

+0

Ну, мы предполагаем, что он знает о сфере видимости и знал бы, что не будет переписывать переменные в пределах одной области. # 3 - не идеальное решение. Похоже, что OP обновил сообщение, проблема, которую я вижу сейчас, состоит в том, что кажется, что он вызывает 'console.log (слова);' вне '$ (document) .ready()', естественно, слова не будут существовать, когда console.log вызывается как console.log будет работать до того, как документ будет готов. –

0

Поскольку вы имеете дело с асинхронным интерфейсом для чтения данных, вы можете только строить дальше. Поэтому в основном вам придется отменить свою цель «вывести данные» в «ввод в обработку».

Вы можете придать функцию обработки в функцию чтения:

function get_words(process) { 
    ... 
    $.get(...){ function(data){ 
     ... 
     process(word, syllabs); 
    } 
} 

function put_word(w, s) { 
    ... 
} 

//this is where the action starts: 
get_words(put_word); 

Пример: http://jsfiddle.net/xtofl/Qb867/

+0

Хмм, я не понимаю ваш код вообще, но асинхронный - это ключевое слово, которое мне нужно. – prismspecs

+0

Я никогда не видел ничего подобного! Тем не менее, мне кажется, что мне нужно. Спасибо. Так действительно ли это функция обратного вызова? как function_first (function_second)? и это выполнит первый, а затем второй? – prismspecs

+0

Хмм, он все еще возвращается неопределенным – prismspecs

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