traitements simultanés étranges

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Hello :)

j'ai une fonction récursive. Elle doit exécuter une autre fonction plusieurs fois findPixel, de manière asynchrone. J'utilise des promises pour savoir quand toutes les requêtes se sont exécutées, pour savoir quand relancer la fonction findRangee.

Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function findRangee(a, na, callback)
{
    console.log("rangee");
    promesses = new Array();

    for(b = 0; b < a; b++)
    {
        if(b >= w)
            b = w-1
        c = a-b;
        if(c >= h)
            c = h-1
        console.log("a: "+a+" b:"+b+" c:"+c);

        var ma_promesse = findPixel(b, c).then(function(retour){
            console.log(util.inspect(retour));
        })
        promesses.push(ma_promesse);
    }

    Promise.all(promesses).then(function() {
        if(a < na)
        {
            console.log("new rangee");
            findRangee(a+1, na, callback);
        }else{
            callback();
        }
    });
}

function findPixel(x, y) {
    return new Promise(function (resolve, reject) {
        var objToFind = {};
        if(y > 0)
        {
            objToFind['haut'] = data[y-1][x];
        }else{
            objToFind['haut'] = null;
        }
        if(x > 0)
        {
            objToFind['gauche'] = data[y][x-1];
        }else{
            objToFind['gauche'] = null;
        }

        //ici j'utilise find avec une limite de 1, mais c'est temporaire, sinon j'aurais utilisé findOne
        db.collection("pixels").find(objToFind).limit(1).toArray(function (error, results) {
            if (error) throw error;

            resolve(results);
        });
    });
}

Cependant, cela ne marche pas comme je voudrais:/

1
2
3
var ma_promesse = findPixel(b, c).then(function(retour){
    console.log(util.inspect(retour));
})

ce console.log ne s’exécute jamais.

1
2
3
4
5
6
7
8
9
Promise.all(promesses).then(function() {
    if(a < na)
    {
        console.log("new rangee");
        findRangee(a+1, na, callback);
    }else{
        callback();
    }
});

Cependant, ce console.log s’exécute tout de suite

Une idée d'où cela peut venir ?
Merci d'avance :)

Au passage merci Viki53 et Thunderseb pour super tuto :)

Bonjour coupain. Va voir mon Blog, et dit moi par mp ce que tu en pense

+0 -0

Bonjour.

Vu que tu es dans une promesse, il n'est pas conseillé de lancer une exception mais plutôt de rejeter la promesse, c'est fait pour ça.

1
2
3
4
5
db.collection("pixels").find(objToFind).limit(1).toArray(function (error, results) {
    if (error) reject(error);

    resolve(results);
});

Promise.all va exécuter toutes tes promesses, il n'est pas nécessaire de le faire avant.

1
2
3
4
5
6
7
/*
var ma_promesse = findPixel(b, c).then(function(retour){
    console.log(util.inspect(retour));
})
promesses.push(ma_promesse);
*/
promesses.push(findPixel(b, c));

Et comme tu attends plusieurs promesses, autant profiter du Promise.all pour récupérer tous les retours en même temps. Tu obtiens un tableau avec le retour de chaque promesse dedans. Et en cas d'erreur, tu récupères les erreurs grâce à la fonction catch.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Promise.all(promesses).then(function(retours) {
    console.log(util.inspect(retours));

    if(a < na)
    {
        console.log("new rangee");
        findRangee(a+1, na, callback);
    }else{
        callback();
    }
}).catch(function(erreurs) {
  console.error(erreurs);
});

Je n'ai pas testé le code, mais cela devrait t'apporter plus d'informations pour résoudre ton problème.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte