Aller au contenu
AstucesPower Apps

Power Apps

La fonction Concurrent() que personne n'utilise

Concurrent() lance plusieurs appels de données en parallèle au lieu de séquentiellement. Le OnStart de votre application pourrait se charger 3x plus vite.

Le problème

La plupart des Power Apps chargent les données séquentiellement dans App.OnStart. Chaque appel ClearCollect ou Set attend que le précédent se termine avant de démarrer. Si vous chargez des données depuis trois sources qui prennent chacune 1 seconde, votre application met 3 secondes à démarrer.

Mauvaise approche : Chargement séquentiel

Code
// App.OnStart -- runs one after another
ClearCollect(colCustomers, Customers);         // 1.2s
ClearCollect(colProducts, Products);           // 0.8s
ClearCollect(colOrders, ActiveOrders);         // 1.5s
Set(varUserProfile, Office365Users.MyProfile()); // 0.5s
// Total: ~4.0s

Chaque ligne bloque jusqu'à ce que les données soient retournées. L'utilisateur fixe un écran de chargement pendant 4 secondes.

Bonne approche : Chargement avec Concurrent()

Code
// App.OnStart -- all four calls fire at once
Concurrent(
    ClearCollect(colCustomers, Customers),
    ClearCollect(colProducts, Products),
    ClearCollect(colOrders, ActiveOrders),
    Set(varUserProfile, Office365Users.MyProfile())
);
// Total: ~1.5s (limited by the slowest call)

Les quatre appels de données s'exécutent simultanément. Le temps de chargement total est égal à la durée de l'appel le plus lent, pas à la somme de tous les appels.

Règles

  • Pas de dépendances entre les appels. Si colOrders a besoin d'une valeur de colCustomers, ils ne peuvent pas être dans le même bloc Concurrent().
  • Pas d'ordre garanti. Les appels peuvent se terminer dans n'importe quel ordre.
  • Les erreurs sont indépendantes. Si un appel échoue, les autres se terminent quand même. Vérifiez les résultats individuellement après le bloc Concurrent().

Pattern pratique

Divisez votre OnStart en groupes indépendants et dépendants :

Code
// Step 1: Independent calls in parallel
Concurrent(
    ClearCollect(colConfig, ConfigTable),
    Set(varUser, Office365Users.MyProfile())
);

// Step 2: Dependent calls that need Step 1 results
ClearCollect(
    colMyTasks,
    Filter(Tasks, AssignedTo = varUser.Mail)
);

Point clé

Auditez votre App.OnStart. Regroupez les appels de données indépendants dans des blocs Concurrent() et gardez les appels dépendants en séquentiel. La plupart des applications voient une amélioration de 2 à 3x du temps de démarrage.