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
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é. . .
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.