2016-12-05 1 views
3

Je suis nouveau à Node.js et je ne sais pas comment exécuter une fonction settimeout avant une autre fonction,NodeJS Exécuter la tâche dans l'ordre

par exemple,

var async = require('async'); 
function hello(){ 
    setTimeout(function(){ 
     console.log('hello'); 
    },2000);} 

function world(){ 
    console.log("world"); 
} 
async.series([hello,world()]); 

et la sortie est toujours le monde bonjour. Est-ce que j'utilise la bibliothèque, n'est-ce pas?

Je ne sais pas la question semble triviale, mais je n'ai vraiment aucune idée de comment forcer une tâche courte à exécuter après un long

+0

Plusieurs problèmes: 1) l'expression 'monde()' 'exécute world' immédiatement (ce qui est fait * avant *' hello' est jamais appelé) 2) 'hello' retourne * avant * l'exécution de setTimeout. Pour une utilisation de async, l'idiome 'callback' doit être utilisé. Voir http://stackoverflow.com/questions/15969082/node-js-async-series-is-that-how-it-is-supposed-to-work - ceci explique le problème avec 'world()' et montre l'utilisation du paramètre de rappel. – user2864740

+0

Donc, non: vous utilisez la mauvaise bibliothèque (et ne pas expliquer le comportement correctement). Suivez la documentation et recherchez des exemples. – user2864740

Répondre

3

Async vous oblige à utiliser callback. Suivez le lien this pour voir quelques exemples. Le code suivant doit générer hello world correctement:

var async = require("async"); 
function hello(callback) { 
    setTimeout(function(){ 
     console.log('hello'); 
     callback(); 
    }, 2000); 
} 

function world(callback) { 
    console.log("world"); 
    callback(); 
} 

async.series([hello, world], function (err, results) { 
    // results is an array of the value returned from each function 
    // Handling errors here 
    if (err) { 
     console.log(err); 
    } 
}); 

Notez que callback() a été appelée dans la fonction setTimeout() afin qu'il attend le console.log('hello').

-1

Vous pouvez utiliser le rappel qui sont le cœur du nodejs.

var fun1 = function(cb){ 
// long task 
// on done 
return cb(null, result); 
} 

var fun2 = function(cb){ 
return cb(null, data); 
} 

fun1(function(err, result){ 
if(!err){ 
    fun2(function(er, data){ 
    // do here last task 

    }) 
} 
} 

// to avoid pyramid of doom use native promises 

func1(){ 
return new Promise((resolve, reject) => { 
    // do stuff here 
    resolve(data) 
}) 

} 
func2(){ 
    return new Promise((resolve, reject) => { 
    resolve(data); 
    }) 
} 

Et puis les appeler à l'aide:

func1.then((data) => { 
return func2(); 
}) 
.then((resule) => { 
//do here stuff when both promises are resolved 
}) 
+0

Les réponses doivent être dans le contexte de 'async' (qui utilise lui-même de tels rappels) depuis qu'il a été donné. Ceci montre la base d'une tour-de-malheur et n'explique pas le (s) problème (s) avec le code original. – user2864740

+0

Bien que vous pouvez simplement utiliser les promesses pour cela !! Vous n'aurez même pas besoin de la bibliothèque asynchrone pour le faire ou vous pouvez aussi utiliser le rendement pour rendre votre code plus lisible. –

+0

merci les gars! J'étudierai plus sur le rappel, car je suis nouveau sur nodejs et je ne comprends pas vraiment la syntaxe! –

-1

Vous pouvez utiliser des promesses plutôt que des rappels. donc votre code ressemblera à ceci:

var async = require('async'); 
    function hello(){ 
    setTimeout(function(){ 
     console.log('hello'); 
    },2000);} 

    function world(){ 
    console.log("world"); 
     } 
    return Q.fcall(function() { 
     hello(); 
    }) 
    .then(function(resultOfHelloFunction){ 
     world(); 
}); 

La fonction World() ne sera exécutée que lorsque la fonction hello() aura terminé son exécution.

P.S: J'utilise bibliothèque Q à promisify fonctions. C'est très bien d'utiliser d'autres bibliothèques (comme bluebird) pour obtenir la même chose.

+0

Puisqu'il demandait à propos de 'async' lui donner une réponse sur les promesses n'a pas beaucoup de sens. – Paul

+0

merci l'homme! ne sait jamais des promesses avant! –

0

utilisation promesse

function hello(){ 
    return new Promise(function(resolve, reject) { 
     console.log('hello'); 
     resolve(); 
    }); 
} 

function world(){ 
    return new Promise(function(resolve, reject) { 
     console.log("world"); 
     resolve(); 
    }); 
} 


    hello() 
    .then(function(){ 
    return world() 
    }) 
    .then(function(){ 
    console.log('both done'); 
    }) 
    .catch(function(err){ 
    console.log(err); 
    }); 
+0

merci! Ça marche! –

+0

Pouvez-vous s'il vous plaît upvote et marquer ma réponse comme correcte si cela fonctionne pour vous @ParosKwan –