2014-02-02 1 views
0

Мой вопрос о readTextAsync и writeTextAsync в контексте приложений для магазинов Windows. Я искал StackOverflow и MSDN, а также в Google Googled.readTextAsync в winjs не всегда читает мой файл

Мой код приведен ниже:

Windows.Storage.ApplicationData.current.roamingFolder.getFileAsync("sample.txt") 
    .then(
     function(samplefile){ 
      return Windows.Storage.FileIO.readTextAsync(samplefile) 
     }, 
     function(e){}, 
     function(samplefile){ 
      Windows.Storage.FileIO.readTextAsync(samplefile) 
     } 
    ) 
    .done(
     function(something){ data = something; }, 
     function(){}, 
     function(something){ data = something; } 
    ); 

Моя проблема заключается в том, что большую часть времени файл не читается. Когда я отлаживаю, он читается с перерывами.

Возможно, проблема заключается в том, что не хватает времени для завершения асинхронного вызова. Я совершенно новый для программирования приложений Windows и javascript.

Буду признателен за любую помощь. Благодарю. ravi

+0

Почему ваши обработчики ошибок пустые? Что вы намерены делать обработчикам прогресса, особенно в том, что «тогда»? И что такое назначение 'data' ??? – Bergi

+0

Берги - спасибо за комментарии. Не решили, что делать в случае ошибки. Это причина для обработчика ошибок emptry. В обработчике выполнения для этого я просто пытаюсь повторить вызов, чтобы обеспечить завершение. Я хочу, чтобы текст, который считывается, будет храниться в данных для последующей обработки. – user3261731

+0

Как возникает проблема? Есть ли какие-либо ошибки, фрагментарные данные? – Bergi

ответ

1

Что вы связываете с несколькими обещаниями, вы должны иметь одну функцию ошибки в конце, где вы ставите свое «сделано».

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

, как вы должны написать это:

Windows.Storage.ApplicationData.current.roamingFolder.getFileAsync("sample.txt") 
.then(
    function(samplefile){ 
     return Windows.Storage.FileIO.readTextAsync(samplefile) 
    } 
) 
.done(
    function(data){ //do something with your data, like assign to a list }, 
    function(error){ //do something with error }, 
    function(data){ //do something with your data } //progress function,not sure what you want to do with this 
); 

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

Вы должны обрабатывать данные внутри проделанного функции, потому что если вы Ассинг его внешней переменной (ваш data объект), как вы делали, что переменная будет пустой, когда вы пытаетесь использовать, потому что, скорее всего, сделано метод еще не произошло.

+0

Maurizio - спасибо за исправленный код и объяснение. Я считаю, что начинаю понимать свою проблему. В основном, я пытаюсь сохранить список имен в файле - одно имя в записи, а затем получить имена из файла и заполнить элемент списка или выпадающего списка. Как обеспечить, чтобы асинхронный вызов был завершен, и ошибок нет? т. е. все имена в файле были прочитаны и загружены в список? был бы признателен за любую помощь, которую вы можете предложить. Благодарю. – user3261731

+1

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

+0

Благодарим вас за объяснение. По сути, мне не хватало точки, что требуемая обработка должна выполняться в методе .done. Я понял. Большое спасибо. – user3261731

0

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

Это не имеет никакого смысла. Это может даже привести к условиям гонки, так как вы пытаетесь прочитать файл , а все еще в процессе. Кроме того, повторный вызов не возвращает ничего, и задача не будет привязана/синхронизирована с потоком остальных. Удалите этот обработчик.

Причина для обработчика ошибок emptry - я не решил, что делать в случае ошибки.

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

Я хочу, чтобы текст, который читается, хранится в data для последующей обработки.

Но когда "позже"? Вам нужно будет убедиться, что обработка не начнется до того, как файл будет полностью прочитан, для чего вам нужно будет подключить обработчик done по вашему обещанию. Выполняйте обработку в цепочке обещаний, никогда не используйте переменные глобального/более высокого уровня с обещаниями.Если вам нужно data несколько раз, вы можете просто сохранить обещание в переменной и приложить несколько обработчиков done (которые будут работать, даже если обещание уже разрешено).

+0

Берги - спасибо за объяснения. Вы помогли мне понять мои мысли во многих отношениях. – user3261731

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