Async: Fonctionnalité/support - Ensemble de tâches vide -> rappel final automatiquement déclenché à la prochaine tick ?

Créé le 13 avr. 2017  ·  3Commentaires  ·  Source: caolan/async

Disons que nous utilisons async.map ou vraiment presque tous les utilitaires asynchrones

Ma question/demande de fonctionnalité est la suivante : si le tableau/ensemble de tâches est vide, async déclenche-t-il le rappel final au prochain tick ? Sinon, existe-t-il un moyen de dire à async de le faire? Ce serait une fonctionnalité intéressante.
Sinon, j'en ai beaucoup dans mon code, qui est plus verbeux :

async.map([], function(item,cb){

}, function final(err, results){
    process.next(function(){ 
      cb(err,results);
   });
});

pour éviter Zalgo, ceci ci-dessus est nécessaire, mais, c'est beaucoup plus agréable à faire :

async.map([], function(item,cb){

}, cb);

Je suppose qu'une chose que nous pourrions est de vérifier si le tableau est vide, et si c'est le cas, revenez tôt avec

if(![].length){
   return process.next(cb);
}

qu'est-ce que vous recommandez?

question

Commentaire le plus utile

Oui, @hargasinski l' a sur l'argent. Nous ne vous protégeons pas de Zalgo pour des raisons de performances.

Une simplification que vous pouvez faire est :

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate tout vous permet de passer des arguments qui seront passés à la fonction.

Tous les 3 commentaires

Salut @ORESoftware , merci pour la question ! Pour un tableau/ensemble vide, async invoque le rappel final sur le même tick car les reports intégrés ont été supprimés dans v2.0.0 pour des raisons de performances (je ne pense pas que async < v2.0.0 avait même un report intégré pour ce cas).

Une solution simple consiste à envelopper async.map dans async.ensureAsync :

async.ensureAsync(async.map)([], function(item, cb) {

}, cb);

ou quelque part au début de votre code :

const asyncMap = async.ensureAsync(async.map);
// then call `asyncMap` just as you would `async.map`

Sinon, l'approche process.nextTick vous avez proposée est parfaitement valable. Cependant, si vous écrivez du code qui pourrait être utilisé dans un navigateur, vous devriez jeter un œil à async.setImmediate ou async.nextTick .

Oui, @hargasinski l' a sur l'argent. Nous ne vous protégeons pas de Zalgo pour des raisons de performances.

Une simplification que vous pouvez faire est :

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate tout vous permet de passer des arguments qui seront passés à la fonction.

Oh sympa, je ne connaissais pas ça à propos de process.nextTick, etc, c'est génial

Cette page vous a été utile?
0 / 5 - 0 notes