readTextAsync WinJS无法正常工作

时间:2016-07-27 13:32:10

标签: visual-studio winjs

我需要从文件中读取内容。我有全局变量fileDate,我想把内容放到这个变量,但是当我调用load方法时,变量是未定义的。

<!DOCTYPE html>
<html ng-app="appOne">
<head>
    <meta name="fragment" content="!">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta charset="utf-8" />
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />
    <base href="/">
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    <script src="~/Scripts/angular/angular.js"></script>
    <script src="~/Scripts/angular/angular-route.js"></script>
    <script src="~/Scripts/angular/angular-animate.js"></script>
    <script>
        angular.module('appOne', ['ngRoute'], function ($routeProvider, $locationProvider) {
            $routeProvider.when('/one', {
                template: "<div>one</div>", controller: function ($scope) {
                }
            })
            .when('/two', {
                template: "<div>two</div>", controller: function ($scope) {
                }
            }).when('/', {
                template: "<div>home</div>", controller: function ($scope) {
                }
            });
            $locationProvider.html5Mode({
                enabled: true
            });
        });
    </script>
</head>
<body>
    <div id="body">
        <section ng-view></section>
        @RenderBody()
    </div>
    <div id="footer">
        <ul class='xoxo blogroll'>
            <li><a href="one">one</a></li>
            <li><a href="two">two</a></li>
        </ul>
    </div>
</body>
</html>

对不起我的英文:)

1 个答案:

答案 0 :(得分:1)

不要忘记javascript是异步的,当你调用console.log("main" + fileDate)时,方法loadDate()没有完成,这就是你的fileDate尚未定义的原因。

您可以使用promises来实现这一目标。

以下是基于您的代码的示例:

var filename = "dataFile.txt";
var fileDate;

var applicationData = Windows.Storage.ApplicationData.current;
var localFolder = applicationData.localFolder;

function loadDate() {
    return new Promise(function (onComplete, onError) {
        localFolder.getFileAsync(filename).then(function (file) {

            Windows.Storage.FileIO.readTextAsync(file).then(function (fileContent) {
                fileDate = fileContent;
                console.log("fileContent " + fileContent);

                onComplete(fileDate);
            },
            function (error) {
                console.log("Error on readTextAsync");
                onError(error);
            });
        },
        function (error) {
            console.log("Error on getFileAsync");
            onError(error);
        });
    });
}

现在loadDate()会返回一个承诺,您现在可以使用.then()方法在loadDate()完成时执行操作。

loadDate().then(function (fileDate) {
        console.log("Content : " + fileDate);
    },
    function (error) {
        console.log(error);
    });