Windows 8 activation de l'application Javascript / report du lancement

Donc, actuellement, dans une application Windows 8 WinJS, je suis en train de coder, j'essaie d'obtenir le chargement d'un fichier xml dans la séquence de démarrage de l'application, alors que l'écran de démarrage s'affiche encore, car cet élément xmldoc est nécessaire pour quand Les charges de la page d'accueil et le chargement de la page d'accueil échoueront sans elle.

C'est ma séquence d'initiation par défaut. Js:

(function () { "use strict"; var activation = Windows.ApplicationModel.Activation; var app = WinJS.Application; var nav = WinJS.Navigation; var sched = WinJS.Utilities.Scheduler; var ui = WinJS.UI; app.addEventListener("activated", function (args) { if (args.detail.kind === activation.ActivationKind.launch) { if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { // TODO: This application has been newly launched. Initialize // your application here. console.log("Newly Launched!"); var localSettings = Windows.Storage.ApplicationData.current.localSettings; WinJS.Namespace.define("MyGlobals", { localSettings: localSettings }); // APP RUN TYPE CHECK AND SEQUENCE (FIRST RUN / NOT FIRST RUN): if (MyGlobals.localSettings.values['firstRunCompleted']) { console.log("NOT FIRST RUN!"); // CACHE VERSION CHECK. IF APP HAS BEEN UPDATED, INITIATE NEWLY ADDED CACHE VALUES HERE: } else { console.log("FIRST RUN!") MyGlobals.localSettings.values['firstRunCompleted'] = true; }; //loadXML(); have tried many things with this. doesn't work. } else { // TODO: This application has been reactivated from suspension. // Restore application state here. var currentVolume = app.sessionState.currentVolume; if (currentVolume) { console.log("RESTORE FROM SUSPENSION"); console.log(currentVolume); }; } nav.history = app.sessionState.history || {}; nav.history.current.initialPlaceholder = true; // Optimize the load of the application and while the splash screen is shown, execute high priority scheduled work. ui.disableAnimations(); var p = ui.processAll().then(function () { return nav.navigate(nav.location || Application.navigator.home, nav.state); }).then(function () { return sched.requestDrain(sched.Priority.aboveNormal + 1); }).then(function () { ui.enableAnimations(); }); args.setPromise(p); args.setPromise(WinJS.UI.processAll().then(function completed() { loadSavedColour(); // Populate Settings pane and tie commands to Settings flyouts. WinJS.Application.onsettings = function (e) { e.detail.applicationcommands = { "helpDiv": { href: "html/Help.html", title: WinJS.Resources.getString("settings_help").value }, "aboutDiv": { href: "html/About.html", title: WinJS.Resources.getString("settings_about").value }, "settingsDiv": { href: "html/Settings.html", title: WinJS.Resources.getString("settings_settings").value }, }; WinJS.UI.SettingsFlyout.populateSettings(e); } 

Comme vous pouvez voir où j'ai la ligne commentée de "loadXML ()", c'est là que j'ai besoin de la fonction loadXML (). Voici ma fonction loadXML ():

 function loadXML() { Windows.ApplicationModel.Package.current.installedLocation.getFolderAsync("foldername").then(function (externalDtdFolder) { externalDtdFolder.getFileAsync(MyGlobals.localSettings.values['currentBook']).done(function (file) { Windows.Data.Xml.Dom.XmlDocument.loadFromFileAsync(file).then(function (doc) { WinJS.Namespace.define("MyGlobals", { xmlDoc: doc, }); }) }) }); }; 

(LoadXML est une fonction fonctionnelle et fonctionne dans d'autres scénarios)

Cependant, le problème est que, avant la fin de la fonction loadXML, l'écran de démarrage de l'application disparaît et la page d'accueil home.html est chargée, ce qui démarre le home.js qui l'accompagne, qui a une fonction qui requiert l'objet MyGlobals.xmlDoc loadXML Aurait dû faire. Cela bloque immédiatement l'application, car MyGlobals.xmlDoc est indéfini / nul. J'avais l'habitude d'utiliser cette application en exécutant loadXML dans home.js pour la page home.html directement, mais dans ce scénario, le document XML est rechargé chaque fois que la navigation est effectuée sur la page, en perdant du temps et des ressources. En tant que tel, j'essaie de déplacer le chargement de xmldocument dans le démarrage / l'initialisation de l'application. Merci beaucoup!

loadXML a une fonctionnalité asynchrone et vous devez gérer cela.

Vous ne devez pas vous attendre à ce que loadFromFileAsync (ou l'une des autres fonctions asynchrones) soit terminé avant qu'il ne retourne à l'appelant. Si votre code n'attend pas, vous constaterez que la valeur MyGlobals.xmlDoc ne sera pas définie si vous en avez besoin.

Je l'ai renommé ci-dessous pour être plus précis quant à son comportement. Le grand changement est qu'il renvoie une Promise qui peut être utilisée par l'appelant pour attendre correctement que le document Xml soit chargé. Cette Promise pourrait être utilisée avec d'autres Promise s pour attendre plusieurs conditions si vous souhaitez (ou dans le cas d'autres travaux asynchrones).

 function loadXMLAsync() { return new WinJS.Promise(function (complete, error, progress) { var localSettings = MyGlobals.localSettings.values; var installedLocation = Windows.ApplicationModel.Package.current.installedLocation; installedLocation.getFolderAsync("foldername").then(function (externalDtdFolder) { externalDtdFolder.getFileAsync(values['currentBook']).done(function (file) { Windows.Data.Xml.Dom.XmlDocument.loadFromFileAsync(file).then(function (doc) { complete(doc); }); }); }); }); }; 

Ensuite, en cours d'utilisation:

 loadXmlAsync().then(function(doc) { WinJS.Namespace.define("MyGlobals", { xmlDoc: doc, }); // and any other code that should wait until this has completed }); 

Le code ci-dessus ne gère pas les erreurs.

Je crois que ce que vous devez faire est d'étendre l'écran de démarrage pour donner à votre application plus de temps pour initialiser l'interface utilisateur. Pour votre scénario, il charge le xml.

Je vous suggérerai de lire Comment étendre l'écran de démarrage (HTML) . L'idée principale est d'afficher un écran de démarrage étendu (vous pouvez utiliser la même image que celle par défaut) dans l'événement activé, puis appelez votre loadXML.

En plus d'autres commentaires, ce que vous devez vraiment faire, c'est inclure la promesse de loadXml avec ce que vous passez à args.setPromise. Comme vous le savez, setPromise est une façon de dire au chargeur de l'application d'attendre que cette promesse soit respectée avant de supprimer l'écran de démarrage. Cependant, dans votre code, vous appelez setPromise à plusieurs reprises. Ce que vous devriez faire, c'est rejoindre toutes les promesses dont vous vous attardez (animations, loadXml et configuration du chargement) avec WinJS.Promise.join, afin que vous obteniez une promesse unique qui attend ensuite les trois autres, et quand Rempli, puis retirez l'écran de démarrage.

La suggestion d'Alan pour un écran de démarrage étendu est utile si ce processus de chargement complet finit par prendre trop de temps, car un éclaboussement prolongé vous donne un contrôle total sur ce qui se passe et lorsque la transition arrive à votre page principale.