File io WinJS如何使appendTextAsync等待文件可用

File io WinJS如何使appendTextAsync等待文件可用,file-io,promise,winjs,File Io,Promise,Winjs,我有这样的代码用于登录我的WinJS应用程序: function setupFileLog() { var logFn = function (message, tag, type) { if (!log_file) return; // log_file is global, setup below with a StorageFile object Windows.Storage.FileIO.appendTextAsync(log_file, tag

我有这样的代码用于登录我的WinJS应用程序:

function setupFileLog() {
    var logFn = function (message, tag, type) {
        if (!log_file) return; // log_file is global, setup below with a StorageFile object
        Windows.Storage.FileIO.appendTextAsync(log_file, tag + ' ' + type + ': ' + message)
            .done(null, function (error) {
                // I have a breakpoint here to catch the error
                var msg = error.detail.message;
                }
            });
    };

    app_folder.createFolderAsync('logs', Windows.Storage.CreationCollisionOption.openIfExists)
       .then(function (logfolder) {
           var now = new Date();
           var logfilename = config.device + "_" + now.toDateString() + ".log";
           return logfolder.createFileAsync(logfilename, Windows.Storage.CreationCollisionOption.openIfExists)
       })
       .done(function (file) {
           log_file = file; // save in global var
           WinJS.Utilities.startLog({ tags: "myApp", action: logFn });
       });
}

setupFileLog();

// ...
// do stuff and log things
// ...

WinJS.log && WinJS.log('I did some stuff', 'myApp','info');
WinJS.log && WinJS.log('I got an error: '+error, 'myApp','error');
间歇性地,我的日志fn中出现错误“进程无法访问文件,因为它正被另一个进程使用”或“访问被拒绝”。我认为对WinJS.log的多个调用是冲突的,因为appendText调用的异步性质,并试图在上一个日志调用完成编写之前获取日志文件的句柄


我可以让appendTextAsync等待日志文件不使用吗?我找不到任何电话来检查文件是否忙。我认为有一种方法可以使appendTextAsync以同步方式工作,但我希望在所有情况下都避免这样做,因为这只是一种间歇性的情况

您可以进行一系列按顺序自动执行的调用:

function setupFileLog() {
    var log_file = app_folder.createFolderAsync('logs', Windows.Storage.CreationCollisionOption.openIfExists)
   .then(function (logfolder) {
        var now = new Date();
        var logfilename = config.device + "_" + now.toDateString() + ".log";
        return logfolder.createFileAsync(logfilename, Windows.Storage.CreationCollisionOption.openIfExists)
    });

    WinJS.Utilities.startLog({
        tags: "myApp",
        action: function log_fn(message, tag, type) {
             log_file = log_file.then(function(file) {
                 return Windows.Storage.FileIO.appendTextAsync(file, tag + ' ' + type + ': ' + message)
                 .then(function() {
                     return file;
                 }, function (error) {
                    // I have a breakpoint here to catch the error
                    var msg = error.detail.message;
                    return file; // for further logs, or
                    throw error; // go stop logging
                 });
            });
        }
    });
}

每次调用
log\u fn
都会将另一个
appendTextAsync
调用链接到
log\u文件上。好处是,当日志文件尚未创建时,调用已经链接,而不是简单地删除日志行。

您可以创建一个按顺序自动执行的调用链:

function setupFileLog() {
    var log_file = app_folder.createFolderAsync('logs', Windows.Storage.CreationCollisionOption.openIfExists)
   .then(function (logfolder) {
        var now = new Date();
        var logfilename = config.device + "_" + now.toDateString() + ".log";
        return logfolder.createFileAsync(logfilename, Windows.Storage.CreationCollisionOption.openIfExists)
    });

    WinJS.Utilities.startLog({
        tags: "myApp",
        action: function log_fn(message, tag, type) {
             log_file = log_file.then(function(file) {
                 return Windows.Storage.FileIO.appendTextAsync(file, tag + ' ' + type + ': ' + message)
                 .then(function() {
                     return file;
                 }, function (error) {
                    // I have a breakpoint here to catch the error
                    var msg = error.detail.message;
                    return file; // for further logs, or
                    throw error; // go stop logging
                 });
            });
        }
    });
}

每次调用
log\u fn
都会将另一个
appendTextAsync
调用链接到
log\u文件上。好处是,当日志文件尚未创建时,调用已经链接,而不是简单地删除日志行。

您可以创建一个按顺序自动执行的调用链:

function setupFileLog() {
    var log_file = app_folder.createFolderAsync('logs', Windows.Storage.CreationCollisionOption.openIfExists)
   .then(function (logfolder) {
        var now = new Date();
        var logfilename = config.device + "_" + now.toDateString() + ".log";
        return logfolder.createFileAsync(logfilename, Windows.Storage.CreationCollisionOption.openIfExists)
    });

    WinJS.Utilities.startLog({
        tags: "myApp",
        action: function log_fn(message, tag, type) {
             log_file = log_file.then(function(file) {
                 return Windows.Storage.FileIO.appendTextAsync(file, tag + ' ' + type + ': ' + message)
                 .then(function() {
                     return file;
                 }, function (error) {
                    // I have a breakpoint here to catch the error
                    var msg = error.detail.message;
                    return file; // for further logs, or
                    throw error; // go stop logging
                 });
            });
        }
    });
}

每次调用
log\u fn
都会将另一个
appendTextAsync
调用链接到
log\u文件上。好处是,当日志文件尚未创建时,调用已经链接,而不是简单地删除日志行。

您可以创建一个按顺序自动执行的调用链:

function setupFileLog() {
    var log_file = app_folder.createFolderAsync('logs', Windows.Storage.CreationCollisionOption.openIfExists)
   .then(function (logfolder) {
        var now = new Date();
        var logfilename = config.device + "_" + now.toDateString() + ".log";
        return logfolder.createFileAsync(logfilename, Windows.Storage.CreationCollisionOption.openIfExists)
    });

    WinJS.Utilities.startLog({
        tags: "myApp",
        action: function log_fn(message, tag, type) {
             log_file = log_file.then(function(file) {
                 return Windows.Storage.FileIO.appendTextAsync(file, tag + ' ' + type + ': ' + message)
                 .then(function() {
                     return file;
                 }, function (error) {
                    // I have a breakpoint here to catch the error
                    var msg = error.detail.message;
                    return file; // for further logs, or
                    throw error; // go stop logging
                 });
            });
        }
    });
}

每次调用
log\u fn
都会将另一个
appendTextAsync
调用链接到
log\u文件上。另一个好处是,当日志文件尚未创建时,调用已经链接,而不是简单地删除日志行。

我已经尝试了这段代码,但第二次调用WinJS.log时,它进入了
log\fn
,文件未定义。因此,我无法确定我得到的文件访问错误是否消失了。Hm,带有
.then(function(){return file;}
新的
log\u文件
promise应该再次包含该文件。不确定为什么不包含?等等,我想我通过将其更改为
return Windows.Storage.FileIO.appendTextAsync…
让我确保进行更多测试…到目前为止一切正常!没有更多的文件访问错误,谢谢!还有一个问题--如果我调用
setupFileLog()
同样,要设置一个具有不同名称的新日志文件,后续的日志写入将复制到新文件中。这几乎就像
log\u文件中的旧承诺被链接到新的承诺一样。在创建新的日志文件之前,我应该做些什么来清除现有的日志文件承诺吗?哦,当然,谢谢!最基本的错误在处理承诺时:-/我尝试了此代码,但第二次调用WinJS.log时,它进入了
log\u fn
,文件未定义。因此,我无法确定我遇到的文件访问错误是否消失了。Hm,使用
。然后(function(){return file;}
新的
log\u文件
promise应该再次包含该文件。不确定为什么不包含?等等,我想我通过将其更改为
return Windows.Storage.FileIO.appendTextAsync…
让我确保进行更多测试…到目前为止一切正常!没有更多的文件访问错误,谢谢!还有一个问题--如果我调用
setupFileLog()
同样,要设置一个具有不同名称的新日志文件,后续的日志写入将复制到新文件中。这几乎就像
log\u文件中的旧承诺被链接到新的承诺一样。在创建新的日志文件之前,我应该做些什么来清除现有的日志文件承诺吗?哦,当然,谢谢!最基本的错误在处理承诺时:-/我尝试了此代码,但第二次调用WinJS.log时,它进入了
log\u fn
,文件未定义。因此,我无法确定我遇到的文件访问错误是否消失了。Hm,使用
。然后(function(){return file;}
新的
log\u文件
promise应该再次包含该文件。不确定为什么不包含?等等,我想我通过将其更改为
return Windows.Storage.FileIO.appendTextAsync…
让我确保进行更多测试…到目前为止一切正常!没有更多的文件访问错误,谢谢!还有一个问题--如果我调用
setupFileLog()
同样,要设置一个具有不同名称的新日志文件,后续的日志写入将复制到新文件中。这几乎就像
log\u文件中的旧承诺被链接到新的承诺一样。在创建新的日志文件之前,我应该做些什么来清除现有的日志文件承诺吗?哦,当然,谢谢!最基本的错误在处理承诺时:-/我尝试了此代码,但第二次调用WinJS.log时,它进入了
log\u fn
,文件未定义。因此,我无法确定我遇到的文件访问错误是否消失了。Hm,使用
。然后(function(){return file;}
新的
log\u文件
promise应该再次包含该文件。不确定为什么不包含?等等,我想我通过将其更改为
return Windows.Storage.FileIO.appendTextAsync…
让我确保进行更多测试…到目前为止一切正常!没有更多的文件访问错误,谢谢!还有一个问题--如果我调用
setupFileLog()
同样,要设置一个具有不同名称的新日志文件,后续的日志写入将复制到新文件中。这几乎就像
log\u文件中的旧承诺被链接到新的承诺一样。在创建新的日志文件之前,我应该做些什么来清除现有的日志文件承诺吗?哦,当然,谢谢!最基本的错误在处理承诺时:-/谢谢@Bergi fo