javascript - Problèmes de concurrence des fonctions génératrices dans js que vous ne connaissez pas
为情所困
为情所困 2017-06-12 09:31:03
0
2
664

J'ai vu un tel code dans un livre. Le but du code est de lancer deux requêtes ajax asynchrones en même temps et de placer les résultats dans un tableau dans l'ordre

//假设request是基于primose的ajax工具
var arr = [];
function *reqData ( url ) {
    var data = yield request(url);
    yield;    //关于这一行书上是这样解释的,控制转移
    arr.push(data);
}
var it1 = reqData("http:....1"), it2 = reqData("http:....2");    //总之是2个不同的url地址
var p1 = it1.next(), p2 = it2.next();
p1.then( function(data) {
    it1.next(data);
} );
p2.then( function(data) {
    it2.next(data);
} );
Promise.all([p1, p2]).then( function () {
    it1.next();
    it2.next();
} );

Je n’ai jamais compris à quoi sert le transfert de contrôle, et le livre n’en dit pas grand chose

var arr = [];
function *reqData ( url ) {
    arr.push( yield  request(url) );
};
var it1 = reqData("http:....1"), it2 = reqData("http:....2");    //总之是2个不同的url地址
var p1 = it1.next(), p2 = it2.next();
Promise.all([p1, p2]).then( data => {
    var [data1, data2] = data;
    it1.next(data1);
    it2.next(data2);
});

Ceci est mon code simplifié, supprimant le transfert de contrôle. Quels sont les dangers cachés de cela par rapport à celui d'origine

为情所困
为情所困

répondre à tous(2)
巴扎黑

Personnellement, je pense que la raison pour laquelle le code du livre est si verbeux est simplement pour garantir l'ordre d'obtention du tableau de données.
Au contraire, votre code simplifié est très élégant, simple et épuré. . .

phpcn_u1582

C'est-à-dire qu'après avoir obtenu les données, le générateur est à nouveau mis en pause, en attendant un enregistrement uniforme sur le tableau et en contrôlant l'ordre d'écriture sur le tableau.

Le code dans votre version réécrite de Promise.all est inutile.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal