File io WinJS如何使appendTextAsync等待文件可用
我有这样的代码用于登录我的WinJS应用程序: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
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