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

时间:2014-02-02 01:01:40

标签: javascript winjs promise

我的问题是关于Windows商店应用程序上下文中的readTextAsyncwriteTextAsync。我已经搜索了StackOverflow和MSDN,还搜索了其他广泛的用户。

我的代码如下:

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的新手。

我将不胜感激任何帮助。谢谢。拉维

2 个答案:

答案 0 :(得分: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对象),当你尝试时该变量将是空的使用,因为很可能还没有发生完成方法。

答案 1 :(得分:0)

  

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

这没有任何意义。它甚至可能导致竞争条件,因为您尝试读取文件,而仍然正在进行中。此外,重复调用不会返回任何内容,并且任务不会与其余任务的流程链接/同步。删除该处理程序。

  

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

然后你可以省略它。然后,错误会“冒泡”起来,并且可能会陷入其他依赖失败者的承诺中。

  

我希望将读取的文本存储在data中以便以后处理。

是“以后”时?您需要确保在完全读取文件之前不开始处理 - 您需要为您的承诺挂钩done处理程序。在promise链中进行处理,永远不要使用promises的全局/更高范围的变量。如果您需要多次data,您可以简单地将promise存储在变量中,并附加多个done处理程序(即使已经解析了promise也可以使用)。