Mobile Dev Day 2013

10. November 2013 15:13 by Renaud in Events  //  Tags: , , , , , ,   //   Comments (0)

Première édition du Mobile Dev Day

Le 12 décembre prochain aura lieu un événement sans précédant en Belgique: une journée consacrée entièrement au développement et aux technologies mobiles. Bien sûr, ce n'est pas la première fois qu'on parle de mobile en Belgique, mais cette fois-ci il s'agit d'une journée consacrée principalement aux technologies Microsoft et, qui plus est, en français!

Le site web est en ligne depuis quelques jours: http://www.mobiledevday.be

Un évènement pour les développeurs, par des développeurs

D'où est née l'idée d'organiser cet évènement? L'histoire a commencé avec la Windows Phone Week...

Pour ceux qui n'en auraient pas entendu parler, la Windows Phone Week est une initiative menée par tous les MVP (Most Valuable Professional) Windows Phone du monde et qui consiste à organiser localement des évènements dédiés à cette discipline.

Pas de chance pour nous les Belges, il n'y a pas de MVP Windows Phone parmi nous, ce qui signifie donc pas d'évènement. À moins... qu'un membre de la communauté décide qu'il y a là quelque chose à faire.

Et c'est ainsi que Olivier Matis (www.guruumeditation.net/), MVP C# et Nokia Developer Champion, m'a contacté pour me parler de sa frustration (que je partageais évidemment). La suite s'est enchaînée très rapidement. Il fallait constituer une team pour organiser cet évènement, et nous avons contacté deux membres actifs de la communauté Microsoft en Belgique: Kévin Rapaille - Software Engineer chez RealDolmen et blogueur - et Matthieu Vandenhende - développeur chez Agilys, blogueur et MVP Client Development.

Un programme avec uniquement des têtes d'affiches

Bon alors c'est sûr, on aurait pu se démerder nous même et vous pondre quelques sessions plus ou moins intéressantes. Mais on a voulu faire quelque chose de grand. Et pour ça, on est allé vous chercher de véritables rockstar. Des speakers venus de France et de Belgique. Des développeurs exceptionnels et des employés Microsoft avec des vrais morceaux de Microsoft à l'intérieur.

C'est un peu comme si vous alliez assister à un Techdays, mais en comité réduit, en séance VIP!

En dehors des sessions, vous aurez évidemment la possibilité de discuter et boire un verre avec tous ces gens, ainsi qu'avec tous les autres passionnés qui seront présents ce jour-là.

Inscriptions ouvertes et limitées

Malheureusement, nous ne pouvons pas accueillir des milliers de personnes comme aux Techdays. La comparaison s'arrête là :) Je vous invite donc à vous inscrire assez rapidement. Bloquez votre 12 décembre, et venez passer une super journée avec la communauté Microsoft Belux. L'entrée est bien évidemment gratuite ;)

Pour avoir toutes les informations, rendez-vous sur le site officiel : http://www.mobiledevday.be

Sponsors

Et enfin il faut le signaler, un évènement de cette taille nécessite des moyens, et nous ne pourrions pas y arriver sans l'aider de nos sponsors principaux que sont:

Planning de la rentrée 2013-2014

Trainings gratuits au Microsoft Innovation Center de Mons

Plein de nouvelles formations planifiées au MIC pour la rentrée, avec des sessions sur Windows Phone et Windows 8 en C#/XAML et en JavaScript/HTML5! Toutes ces formations sont évidemment gratuites, en français, et ouvertes à tous!

Create your Windows 8 app in HTML5

How different is Windows 8? What is the rush to build apps for the Windows 8 platform and why are developer communities reacting differently to Windows 8?  This Windows Store App course introduces HTML5, CSS3, and JavaScript and helps you learn HTML5/CSS3/JavaScript programming skills. This course is an entry point into both the Web application and Windows Store apps.

 18 septembre, 5 novembre, 10 janvier

 

The Ins & Outs of Windows Phone 8 apps

The ins & outs of Windows Phone 8 is a hands on introduction to building apps for Windows Phone. We’ll guide you through the unique aspects of the Windows Phone platform and you’ll have the chance to build on your knowledge immediately! Your app at the end of the day!

 30 septembre, 12 novembre, 20 janvier

 

Making your first Windows 8 app

This workshop is a free and fun training from developers, for developers. Expertise is offered in a fun, low key, interactive way and you’ll have the chance to test and experiment with your new knowledge!

 16 octobre, 9 décembre, 12 février

 

Make your app run into the Cloud 

Et pour étendre les capacités de vos apps et lier tout ça avec le cloud, sachez qu'une session Cloud & Windows Azure est également prévue et sera donnée par Nick Trogh, Developer and Platform Evangelist chez Microsoft BELUX.

In this workshop, we’ll teach you how to add a cloud backend to your app. Free, fun, no-fluff, you will learn how to add a cloud-based backend service to a Windows Store app using Windows Azure Mobile Services. And you’ll have the chance to test and experiment with your new knowledge!

 11 décembre

 

Encore plus de sessions

Je donnerai également des formations au MIC Brussels (voir leur agenda) sur les mêmes sujets, mais probablement en anglais cette fois (cela dépendra de l'audience :)).

[Windows 8] Générateur de politique de confidentialité

4. June 2013 21:37 by Renaud in Windows 8, Windows Azure  //  Tags: , , ,   //   Comments (1)

Vous le savez sans doute, sur Windows 8, l'utilisateur doit toujours garder le contrôle sur son système. Et pour cela, Microsoft n'a pas seulement fait en sorte que le système soit sécurisé, mais a également établi quelques règles pour nous les développeurs. Ces règles visent particulièrement à informer l'utilisateur de l'usage que nous pourrions faire de leurs données.

Ainsi, pour utiliser des fonctionnalités de Windows 8 qui touche au respect de la vie privée (GPS, accès aux librairies personnelles comme les documents, les photos, etc, ...), il est nécessaire de le déclarer explicitement. L'utilisateur verra alors - avant de télécharger l'application - que vous réclamez l'un ou l'autre droit.

En ce qui concerne l'accès à internet, les choses sont également très claires: si votre application fait usage d'internet, vous devez fournir à l'utilisateur une Politique de Confidentialité consultable en ligne!

Alors si vous êtes un peu fainéants ou que vous n'avez aucune idée de comment héberger une page web, voici un petit générateur que j'ai mis en ligne sur mon compte Windows Azure:

http://w8privacy.azurewebsites.net/

Rien de très complexe, mais c'est surtout pratique :) développé en deux temps, trois mouvements avec Foundation. L'intérêt étant que vous aurez une page personnalisée (et multilingue!) pour votre application!

Il vous suffit de suivre les étapes, et c'est parti, vous aurez une URL unique que vous pourrez utiliser dans la page "À propos" de votre application ET dans le formulaire de soumission de votre application sur le Windows Store!

 

Bonus : si cela ne vous suffit pas tout à fait, les sources sont dispos sur GitHub: W8Privacy

[Windows 8] Développez en HTML 5 pour Windows 8

29. April 2013 14:53 by Renaud in Windows 8  //  Tags: , , ,   //   Comments (0)

* Petite pub perso Tongue Out *


Ces derniers moi j'ai écrit un bouquin traitant de Windows 8 avec Loïc Bar et Simon Boigelot. Ce livre parle du développement d'applications pour le store Windows 8 à base de HTML 5 et de JavaScript !

Ce livre s'adresse aux débutants, aux personnes n'ayant pas nécessairement d'expérience avec les technologies du monde Microsoft. Vous n'avez jamais fait de .NET? Mais vous avez déjà bidouillé avec du HTML?

Si vous voulez passer à la vitesse supérieure, tirer profit du nouvel OS de Microsoft et pourquoi pas commencer à gagner un peu d'argent en vendant vos applications, ce livre est pour vous ! :)

Développez en HTML 5 pour Windows 8

[Windows 8] Créer un timer rond en XAML

15. April 2013 21:27 by Renaud in Expression Blend, Windows 8, XAML  //  Tags: , , , ,   //   Comments (0)

Pour le développement du jeu WordDefy pour Windows 8, Matthieu (@MatthieuVdh) et moi avons demandé l'aide d'une amie graphiste. Et comme elle nous a rapidement pondu un super truc, la moindre des choses c'était de tenter de le reproduire à l'identique ! Il y a plusieurs bons côtés à cela : premièrement on a une app avec un look plutôt sympa, et deuxièmement j'ai pu jouer avec Blend et m'amuser avec le XAML, ce qui fait que j'ai appris pas mal de choses!

Une des parties consistait à reproduire un Timer en forme de cercle. Pour que vous y voyez plus clair, voici le compteur original tel que designé et le résultat final (qui est assez ressemblant :)) en XAML :

Design original
Design original

Résultat en XAML
XAML

Conception d'un RoundedTimer

Il existe plein d'exemples de timer sur le web, mais aucun fonctionnant sous WinRT. Et évidemment, le XAML sur Windows 8 a quelques particularités qui font que l'exemple ne sont pas toujours utilisables. J'en ai donc recréé un avec Blend !

Générer un Path

La première étape consiste à créer le cercle du compteur. Ce cercle doit être transparent au milieu. Pour faire cela, on va utiliser deux Ellipses et les combiner (ou plus précisément les soustraire). Placez donc deux Ellipses de manière à ce qu'elles soient centrées sur le même point, et avec l'une d'elle légèrement plus petite que l'autre.

Le code jusqu'à présent:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    	<Ellipse Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="200" Margin="160,240,0,0" Stroke="Black" VerticalAlignment="Top" Width="200"/>
    	<Ellipse Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="140" Margin="190,270,0,0" Stroke="Black" VerticalAlignment="Top" Width="140"/>
    </Grid>

Pour obtenir le résultat voulu, on peut donc soustraire la deuxième Ellipse à la première ou exclure les zones de chevauchement (lisez aussi Combiner des formes et des tracés (Blend pour Visual Studio)). Faites un clique droit sur l'arbre visuel et les Ellipses sélectionnées et choisissez l'opération qui vous convient dans le menu Combiner

Le résultat de cette opération est un Path généré en remplacement des deux Ellipses précédemment créées. Le résultat devrait ressembler à ceci:

Et le code correspondant : 

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    	<Path Data="M100,30.5 C61.6162,30.5 30.5,61.6162 30.5,100 C30.5,138.384 61.6162,169.5 100,169.5 C138.384,169.5 169.5,138.384 169.5,100 C169.5,61.6162 138.384,30.5 100,30.5 z M100,0.5 C154.952,0.5 199.5,45.0477 199.5,100 C199.5,154.952 154.952,199.5 100,199.5 C45.0477,199.5 0.5,154.952 0.5,100 C0.5,45.0477 45.0477,0.5 100,0.5 z" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="200" Margin="160,240,0,0" Stretch="Fill" Stroke="Black" UseLayoutRounding="False" VerticalAlignment="Top" Width="200"/>
    </Grid>

Ce cercle est la base de notre RoundedTimer... Passons à l'étape suivante: le clipping ! :)

Clipping Path

Le principe du clipping path est d'utiliser un élément pour délimiter la zone visible d'un autre élément. Malheureusement dans les apps Windows Store on ne peut pas utiliser un Path pour "masquer" un autre élément. Par contre on peut utiliser des Ellipse et des Rectangle pour délimiter une zone. 

Ajoutons par exemple un Rectangle dans sur un coin de notre cercle : 

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Rectangle Margin="160,240,1106,428" Width="100" Height="100"/>
    <Path Data="M100,30.5 C61.6162,30.5 30.5,61.6162 30.5,100 C30.5,138.384 61.6162,169.5 100,169.5 C138.384,169.5 169.5,138.384 169.5,100 C169.5,61.6162 138.384,30.5 100,30.5 z M100,0.5 C154.952,0.5 199.5,45.0477 199.5,100 C199.5,154.952 154.952,199.5 100,199.5 C45.0477,199.5 0.5,154.952 0.5,100 C0.5,45.0477 45.0477,0.5 100,0.5 z" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="200" Margin="160,240,0,0" Stretch="Fill" Stroke="Black" UseLayoutRounding="False" VerticalAlignment="Top" Width="200"/>
</Grid>

 

Le résultat obtenu est le suivant : 

On se retrouve avec un quart de cercle, ce qui va en fait représenter un quart de notre RoundedTimer ! Ce qu'il reste à faire est d'animer ce quart de Timer pour représenter le temps qui s'écoule.

Animer le Timer

Pour cela on va utiliser une Transformation sur l'élément RectangleGeometry. A vrai dire il y a sans doute plusieurs façon d'arriver au même résultat ! Pour ma part j'y suis arrivé en utilisant un SkewTransform.

Si l'on reprend le quart de cercle précédent, on peut l'animer en utilisant la transformation correcte : 

<Path Data="M100,30.5 C61.6162,30.5 30.5,61.6162 30.5,100 C30.5,138.384 61.6162,169.5 100,169.5 C138.384,169.5 169.5,138.384 169.5,100 C169.5,61.6162 138.384,30.5 100,30.5 z M100,0.5 C154.952,0.5 199.5,45.0477 199.5,100 C199.5,154.952 154.952,199.5 100,199.5 C45.0477,199.5 0.5,154.952 0.5,100 C0.5,45.0477 45.0477,0.5 100,0.5 z" Fill="White" HorizontalAlignment="Left" Height="200" Margin="160,240,0,0" Stretch="Fill" Stroke="Black" UseLayoutRounding="False" VerticalAlignment="Top" Width="200">
	<Path.Clip>
		<RectangleGeometry Rect="0,0,100,100">
			<RectangleGeometry.Transform>
                <!-- AngleY : De 0 à 90 -->
                <SkewTransform CenterX="100" CenterY="100" AngleY="0"/>
            </RectangleGeometry.Transform>
		</RectangleGeometry>
	</Path.Clip>
</Path>

En modifiant la valeur de la propriété AngleY, on peut animer joliment le timer ! Ainsi, avec un angle de 40°, on retrouve la forme suivante :

Il ne reste donc plus qu'à créer trois autres quarts du timer, et à les animer en changeant la valeur d'un des angles toutes les secondes grâce à un DispatcherTimer. L'important étant de voir comment appliquer la SkewTransformation, en jouant sur les propriétés Center et Angle !

Téléchargement / Sources

Vous pouvez télécharger le résultat final sous la forme d'une contrôle sur GitHub ! À vous de le customiser ! :)

Pour l'intégrer dans votre app, rien de plus simple :

<Page
    x:Class="TestApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:roundedTimer="using:RoundedTimer"
    mc:Ignorable="d">
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <roundedTimer:RoundedTimer x:Name="MyTimer" Width="200" Height="200" Duration="00:01:00" />
    </Grid>
</Page>

On instancie le timer dans le XAML, et on démarre le décompte avec un appel à la méthode Start() dans le code-behind :

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            MyTimer.Start();
        }

 

[MOOC] Windows 8 - 2/ Cycle de vie des apps Windows Store

25. March 2013 13:14 by Renaud in MOOC, Windows 8  //  Tags: , , , ,   //   Comments (0)

 

Dans cette deuxième vidéo (la première étant ici : [MOOC] Windows 8 - 1/ Les contrats en C#) , on aborde le cycle de vie des applications Windows Store. Qu'est-ce qui change par rapport aux applications classiques? Pourquoi ces modifications? Et comment gérer tout ça? C'est ce que je vous explique ici !

La gestion du cycle de vie des applications Windows Store

Les applications Windows Store passent par différents états au cours de leur vie. Elles peuvent successivement être actives, suspendues, ou terminées.

Au sommaire :

- Qu'est-ce qui a changé ?

- Gérer le passage entre les différents états

- Sauvegarder la session des utilisateurs avec le SuspensionManager

- Le SplashScreen étendu

- Les BackgroundTask

- Mettre à jour les LiveTile depuis le background

 

  

Après avoir suivi cette vidéo :

Vous saurez comment sauvegarder une session utilisateur, effectuer des tâches en arrière plan et mettre à jour une vignette dynamique depuis votre application !

La suite

Dans la prochaine vidéo, on verra quelques Tips & Tricks sur le XAML, Visual Studio et Blend

Relive TechDays Belgium 2013 online: videos and slides available!

22. March 2013 10:03 by Renaud in Events, Windows 8, Windows Phone  //  Tags: , ,   //   Comments (0)

TechDays

2 weeks ago we closed the Microsoft TechDays 2013 in Antwerp. Close to 2900 IT Professionals, Developers and Students enjoyed 90 sessions with top content led by a broad selection of international and local top speakers. A special THANK YOU goes to our partners, our MVP’s and MEET (Microsoft Extended Experts Team) members and of course, all our enthusiastic attendees! What’s next? The session videos and slides are now available on www.techdays.be! (Re)live the sessions and take the next steps to truly master the technologies. Warm up with a selection from our Technical Evanglists Arlindo Alves and Katrien De Graeve:

Arlindo’s Top Selection Katrien’s Top Selection
Hackers (Not) Halted with Paula Januszkiewicz Become a Windows 8 and Windows Phone App Developer at TechDays with Ben Riga
Moving from Device Centric to a User Centric Management with Corey Hynes Bigger, Faster, Stronger: Optimizing ASP.NET 4 and 4.5 Applications with Mads Kristensen
Windows 8 Client: Part 1 "The OS internals for IT-Pro's" and Part 2 "The Application internals for IT-Pro's" with Tom Decaluwé Behind the scenes of (as many) C# language features with Bart De Smet

Enjoy! The TechDays Team Questions? Connect with us on Twitter, Facebook or simply via e-mail.

[MOOC] Windows 8 - 1/ Les Contrats en C#

14. March 2013 00:03 by Renaud in MOOC, Windows 8  //  Tags: , , ,   //   Comments (0)

Dans cette vidéo d'une heure, on passe en revue les contrats dans les applications Windows Store. Les contrats permettent de développer des applications qui soient cohérentes et intégrées avec l'ensemble du système Windows 8, ce qui donne globalement une meilleure expérience utilisateur.

Les Contrats

On parle ici des trois principaux contrats que sont le Search, le Share et les Settings. De quoi s'agit-il et comment les implémenter dans une application écrite en C# ? Toutes les réponses sont dans la vidéos.

Au sommaire :

03'40" : Search : permettre de chercher dans votre application depuis n'importe où et n'importe quand.
24'33" : Share : tirer profit du potentiel des autres applications grâce au partage de données App-To-App.
41'32" : Settings : rassembler les paramètres de l'app dans un seul endroit pour offrir une expérience consistante.

Après avoir suivi cette vidéo :

Vous aurez appris à développer des applications super-intégrées à Windows 8, ce qui rendra vos utilisateurs contents :) et ça fait toujours plaisir de recevoir des reviews positives !

La suite

Dans les prochaines vidéos, on parlera du Cycle de vie de l'application et on verra quelques Tips & Tricks sur le XAML, Visual Studio et Blend.

 

[Windows 8] Un exemple court pour comprendre ce que sont Promise, then() et done() avec WinJS

27. January 2013 14:01 by Renaud in Windows 8  //  Tags: , , , , ,   //   Comments (0)

Le concept des Promise et la différence entre then() et done() sont assez difficiles à comprendre. Les explications dans la doc MSDN sont abstraites, et on pourrait croire que then() et done() font la même chose... mais ce n'est pas le cas. Voici un petit morceau de code qui, je pense, est plutôt explicite. Copiez/collez-le dans une nouvelle app Windows 8 JS/HTML et placez des breakpoints à chaque ligne, exécutez l'app, et lisez les commentaires. Le but de ce code est également de vous montrer qu'il n'est pas nécessaire avec les Promise d'écrire des fonctions, dans des fonctions, dans des fonctions... En effet, j'ai vu quelques personnes demander en quoi ça facilitait la vie d'utiliser les Promise avec WinJS. Ils demandent cela parce qu'ils pensent qu'ils doivent écrire du code comme cela :

asyncCall().then(function() {
    anotherAsyncCall().then(function(){
        aThirdAsyncCall();
    }
}

Et c'est vrai que dans ce cas, on pourrait se poser des questions sur l'utilité des Promise. On ne fait que réécrire du code avec des callbacks imbriqués pour finir avec un bordel absolu. Evidemment ce n'est pas le cas ! Regardez le code qui suit et lisez les commentaires :)

 WinJS.xhr({ url: "http://www.microsoft.com" })
        .then(function (microsoftResult) {
            // Ici, on reçoit une réponse, comme on s'y attendait.
            // Que faisons-nous ensuite? 
            // On pourrait faire un autre appel async,
            // ou juste retourner une valeur simple pour voir...
            // Retournons une url, que l'on utilisera 
            // par la suite pour faire une nouvelle requête :
            return "http://dev.windows.com";
        }).then(function (devWindowsUrl) {
            // devWindowsUrl contient simplement la valeur retournée dans la partie précédente.
            // Maintenant, essayons un autre appel async
            // et plutôt que d'utiliser des callbacks (then)
            // retournons simplement l'objet Promise !!
            return WinJS.xhr({ url: devWindowsUrl });
        }).then(function (devWindowsResult) {
            // Quand on arrive ici, on peut voir que dewWindowsResult ne contient pas de Promise.
            // Ca contient en fait le résultat de la Promise, c'est à dire la réponse à la requête.
            // C'est donc là que se situe la magie =)

            // Maintenant déclenchons une exception en appelant une fonction inexistante...
            return devWindowsResult.callNonExistingFunction();
        }).then(function (nonExistingResult) {
            // Nous n'atteignons pas ce point-ci...
            return "ha bon, ça existait finalement?";
        }, function (nonExistingError) {
            // Au lieu de ça, on arrive ici, parce que la Promise s'est terminée avec une erreur.
            // Mais c'est pas grave. Vu qu'on est là, on peut gérer cette erreur.
            // On va retourner un message gentil pour rassurer tout le monde.
            return "cette fonction n'existe pas mais c'est ok, on a géré l'exception !";
        }).then(function (errorHasBeenHandledResult) {
            // du coup, tout rentre dans l'ordre et on continue
            return "content =)";
        }).done(function (result) {
            // et pour finir, il faudrait cloturer par un appel à done()
            // La différence est que si une exception est déclenchée
            // à l'intérieur de cette fonction, l'exception sera vraiment lancée
            // et pas simplement passée comme paramètre à un prochain callback

            // L'exception sera lancée de manière asynchrone, donc si elle vous intéresse
            // il faut catcher les exceptions de la dernière chance au niveau de l'app

            // Essayez de dé-commenter cette ligne pour voir.
            //return result.callANonExistingMethod();
        }, function (error) {
            // Ici on peut éventuellement gérer une erreur renvoyée par l'appel asynchrone précédent.
            var resultError = error;
        });

Pour être sûr de catcher les exceptions asynchrone, un petit coup de WinJS pour ajouter un eventhandler au niveau de l'app :

    var app = WinJS.Application;
    app.onerror = function (error) {
        //Log the last-chance exception 
    };

Enfin, sachez que dans le cas où vous terminez par done(), si vous ne fournissez pas de callback pour le onError, et que la Promise se termine avec une erreur, cette erreur sera automatiquement forwardée, et donc une exception de la dernière chance sera déclenchée !

 

[Windows 8] Short code sample to understand Promise, then() and done() with WinJS

27. January 2013 14:01 by Renaud in Windows 8  //  Tags: , , , ,   //   Comments (0)

I just wrote a small piece of code which is, in my opinion, self-explanatory. Copy/past those lines in a blank Windows 8 JS/HTML app and put some break points at each line. Then, follow the story :)

The aim of this example is to show that you don't have to write functions, within functions, within functions.

Indeed, I know some people think they have to write code like this :

asyncCall().then(function() {
    anotherAsyncCall().then(function(){
        aThirdAsyncCall();
    }
}

But then, why would we use Promises ? Is it just another way to write messy code? Of course not ! Look at this code and read the comments :)

 WinJS.xhr({ url: "http://www.microsoft.com" })
        .then(function (microsoftResult) {
            // Here we receive the response, as excepted.
            // So what do we do here? We could try another asynchronous call,
            // or just return a simple value.
            // Let's return the url that we want to fetch in the next call :
            return "http://dev.windows.com";
        }).then(function (devWindowsUrl) {
            // The devWindowsUrl simply contains the value that we returned in the previous call.
            // Now let's try another Async call, and instead of using callbacks here, let's just return the promise !!
            return WinJS.xhr({ url: devWindowsUrl });
        }).then(function (devWindowsResult) {
            // When we are here, you can see that devWindowsResult doesn't contain a promise.
            // It contains the actual value that we wanted to retrieve from the previous async call.
            // That's the magic =)

            // Now let's throw an exception by calling a non-existing function
            return devWindowsResult.callNonExistingFunction();
        }).then(function (nonExistingResult) {
            // We don not hit this breakpoint
            return "wow, does it really exist?";
        }, function (nonExistingError) {
            // Instead, we are here, because the promised is fulfilled with an error
            // Now let's return something nice, because we managed to handle the error.
            return "that function didn't exist but it's okay, we handled the exception!";
        }).then(function (errorHasBeenHandledResult) {
            // then, everything continues normally
            return "happy =)";
        }).done(function (result) {
            // and at the end you should end up with a done function.
            // The difference is that if there is an exception thrown, 
            // within this function, the error will be actually thrown
            // and not just passed as an argument in a next callback.

            // The error is thrown asynchronously, so you should ensure
            // you catch the last-chance exception at the app-level.
            return result.callANonExistingMethod();
        }, function (error) {
            // Here we can eventually handle an error in the previous 'then' error handling callback.
            var resultError = error;
        });

Then, to make sure you handle the exceptions that are thrown asynchronously, you can just add this eventhandler with WinJS :

    var app = WinJS.Application;
    app.onerror = function (error) {
        //Log the last-chance exception 
    };

Finally, if you use a done() function at the end of your async calls, remember that the previous promise could throw an exception. If it is the case, and that you didn't provide a onError callback, the exception will be automatically forwarded and you will end up with a first chance exception !

TextBox

About the author

I'm a developer, blog writer, and author, mainly focused on Microsoft technologies (but not only Smile). I'm Microsoft MVP Client Development since July 2013.

Microsoft Certified Professional

I'm currently working as an IT Evangelist with an awesome team at the Microsoft Innovation Center Belgique, where I spend time and energy helping people to develop their projects. I also give training to enthusiastic developers and organize afterworks with the help of the Belgian community.

MIC Belgique

Take a look at my first book (french only): Développez en HTML 5 pour Windows 8

Développez en HTML5 pour Windows 8

Membre de l'association Fier d'être développeur

TextBox

Month List