Javascript winjs中的readTextAsync并不总是读取我的文件

Javascript winjs中的readTextAsync并不总是读取我的文件,javascript,winjs,promise,Javascript,Winjs,Promise,我的问题是关于windows应用商店应用程序上下文中的readTextAsync和writeTextAsync。我搜索了StackOverflow和MSDN,还广泛搜索了Google 我的代码如下: Windows.Storage.ApplicationData.current.roamingFolder.getFileAsync("sample.txt") .then( function(samplefile){ return Windows.S

我的问题是关于windows应用商店应用程序上下文中的
readTextAsync
writeTextAsync
。我搜索了StackOverflow和MSDN,还广泛搜索了Google

我的代码如下:

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

当你做出许多承诺时,你应该在“完成”的末尾有一个错误函数

通过这种方式,您将能够在读取时查看是否存在错误

你应该这样写:

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
);
但是这个调用可能不是你的问题,如果你把这个代码放在一个普通的函数中,然后调用它,你将无法看到
数据
对象,因为它将以异步方式加载

您必须在done函数中处理数据,因为如果您像这样将其分配给外部变量(您的
数据
对象),那么当您尝试使用时,该变量将为空,因为很可能done方法尚未出现

在进度处理程序中,我只是尝试重复调用,以确保完成

这毫无意义。它甚至可能导致竞争条件,因为您试图在获取文件的过程中读取该文件。此外,重复调用不会返回任何内容,任务也不会链接到rest流中或与之同步。删除该处理程序

使用emptry错误处理程序的原因是我还没有决定在发生错误时应该做什么

那你可以省略它。然后错误就会“冒泡”起来,并可能被其他依赖于失败承诺的承诺所捕获

我希望读取的文本存储在
数据中
以便以后处理


但“以后”是什么时候?您需要确保在文件完全读取之前不会启动处理—为此,您需要在承诺的基础上挂接一个
done
处理程序。也要在承诺链中进行处理,不要在承诺中使用全局/更高范围的变量。如果您多次需要
数据
,您可以简单地将承诺存储在变量中,并附加多个
done
处理程序(即使承诺已解决,这些处理程序也会工作)。

为什么错误处理程序为空?您希望进度处理程序做什么,尤其是
then
中的进度处理程序?对于
数据
的分配是什么?Bergi-感谢您的评论。还没有决定万一发生错误该怎么办。这就是清空错误处理程序的原因。在进度处理程序中,我只是尝试重复调用,以确保完成。我希望读取的文本存储在数据中,以便以后处理。问题是如何显示的?是否有任何错误,数据是否零碎?Maurizio-感谢您更正的代码和解释。我相信我开始明白我的问题了。基本上,我要做的是在一个文件中存储一个名称列表——在一个记录中存储一个名称,然后从文件中检索名称并填充listview或下拉列表控件。如何确保异步调用完成,并且没有错误?i、 e.文件中的所有名称是否已读取并加载到列表中?如果您能提供帮助,我将不胜感激。谢谢。如果代码进入.done方法的第一个函数,则表示该文件已被读取,并且没有错误。您可以将结果分配到其中的列表中。谢谢您的解释。从本质上讲,我忽略了一点,即所需的处理必须在.done方法中进行。我现在明白了。非常感谢。伯吉-谢谢你的解释。你在很多方面帮助我正确思考。