我试图在挂起事件被触发时编写一个文本文件,即在winjs.application.oncheckpoint事件处理程序中。 我正在将我的对象写为JSON文本。 这是代码:
applicationData.localFolder.createFileAsync("dataFile.txt", Windows.Storage.CreationCollisionOption.replaceExisting).then(function (sampleFile) {
var stringData = "";
var i;
for (i = 0 ; i < myData.objData.length - 1 ; i++) {
stringData += '{"title":"' + myData.objData[i].title + '","challange":"' + myData.objData[i].challange + '"},\n';
}
stringData += '{"title":"' + myData.objData[i].title + '","challange":"' + myData.objData[i].challange + '"}';
stringData = "[" + stringData + "]";
return Windows.Storage.FileIO.writeTextAsync(sampleFile, stringData);
}).done(function () { });
但Windows应用程序在将任何内容写入文本文件之前关闭。 我调用了args.setPromise()并将上面的代码作为函数参数传递,但同样的问题仍然存在。
PS:我不知道如何正确地异步进行。 请帮忙。
答案 0 :(得分:2)
只需event.setPromise(applicationData.localFolder.createFileAsync ...)
然后暂停将等到你的承诺结束。删除.done
答案 1 :(得分:2)
.done()
会解决它。
这是因为done()
不返回任何内容,而then()
返回链式承诺。这就是没有人被召唤的原因。
还建议您在应用程序数据发生变化时或在某个时间间隔内保存应用程序数据,而不是等待暂停事件保存所有内容。暂停事件给出5秒的时间。否则,应用程序将按msdn documentation here终止。
“如果应用未在5秒内从暂停事件返回,则Windows会假定应用已停止响应并终止它”
app.oncheckpoint = function (args) {
app.sessionState.history = nav.history;
args.setPromise(Windows.Storage.ApplicationData.current.localFolder.createFileAsync
("dataFile.txt", Windows.Storage.CreationCollisionOption.replaceExisting).then(function (sampleFile) {
var stringData;
// code to set stringData.
return Windows.Storage.FileIO.writeTextAsync(sampleFile, stringData);
}));
};