2015-03-09 13 views
0

Я следующий код, где я звоню обратный вызов после моей асинхронного завершением задачи:обратного вызова не вызывался при использовании async.series

var async = require("async"); 

function _callback(err, result){ 
    if(err) console.log('Error Occurred'); 
    console.log('Callback called'); 
    console.dir(result); 
} 

function tasks() { 
    console.log('Start executing tasks'); 
    var tasks = []; 
    var result = {}; 

    tasks.push(function(_callback) { 
     console.log('Getting some data'); 
     _callback(null, result); 
    }); 
    tasks.push(function(_callback) { 
     console.log('Second function called'); 
     _callback(null, result); 
    }); 

    async.series(tasks, function(){ 
     console.log('All done'); 
    }); 
} 

tasks(); 

Я сверяется с синтаксисом, ожидаемым в библиотеке асинхронной. Код похож на меня.

Может кто-то указать, что здесь нужно изменить.

ответ

1

Попробуйте так:

var async = require("async"); 

function _callback(err, result){ 
    if(err) console.log('Error Occurred'); 
    console.log('Callback called'); 
    console.dir(result); 
} 

function tasks() { 
    console.log('Start executing tasks'); 
    var tasks = []; 
    var result = {}; 

    tasks.push(function(next) { 
     console.log('Getting some data'); 
     next(null, result); 
    }); 
    tasks.push(function(_callback) { 
     console.log('Second function called'); 
     next(null, result); 
    }); 

    async.series(tasks, function(err, result){ 
     console.log('All done'); 
     _callback(err, result); 
    }); 
} 

tasks(); 

Асинхронный дает каждую задачу обратного вызова, который вам нужно позвонить, чтобы асинхронной теперь, когда эта задача закончена. После завершения всех задач вы можете вызвать обратный вызов. Если вы хотите, чтобы ваш обратный вызов вызывался после завершения каждой отдельной задачи, просто добавьте перед каждым next(null, result) также _callback(null, result) Причина, по которой не будет работать ваша реализация, заключается в том, что вы перезаписываете глобальный метод _callback аргументом, который имеет тот же самый имя.

Надежда, что имеет смысл :)

+0

Привет, Бен. У меня проблема с '_callback()' переопределением глобального обратного вызова. Я не понимаю, как использовать 'next()'. Я должен переименовать свой '_callback()'. – jsbisht

+0

Вы просто называете это 'next' по соглашению. Вы могли бы назвать это так, как хотите. Я думаю, они выбрали 'next', потому что, когда вы это называете, это означает, что ваша задача выполнена, и она может выполнить следующую задачу. –

+0

Пробовал, что. Не работает для меня. – jsbisht

0

Вам не нужен вызов функции _callback. Это можно упростить.

var async = require("async"); 

function doSomeLogic(item, callback) { 
    console.log(item); 
    callback(null, item + 2); 
} 

function tasks() { 
    console.log('Start executing tasks'); 
    var tasks = []; 
    var result = {}; 

    tasks.push(function(callback){ 
     // do some more stuff ... 
     callback(null, 'one'); 
    }); 

    tasks.push(function(callback){ 
     // do some more stuff ... 
     callback(null, 'two'); 
    }); 


    async.series(tasks, function(error, results) { 
     if (error) { 
      console.log(error); 
     } 
     console.log(results); 
     console.log('All done'); 
    }); 
} 

tasks(); 
+0

Прошу прощения. Но это не работает. – jsbisht

+0

Я сделал небольшое изменение, попробую еще раз.он работает локально для меня. не могли бы вы объяснить, почему он не работает? –

+0

Я также попробовал обновленный код. 'callback' не вызывается. Не знаете, как здесь будет вызываться 'doSomeLogic'. – jsbisht

1

Как он стоит в вашем коде прямо сейчас, функция _callback вы определили выше никогда не должен вызываться, как _callback в функциях задач является сфера с одной принятого async.

// this will never get called 
function _callback(err, result){ 
    if(err) console.log('Error Occurred'); 
    console.log('Callback called'); 
    console.dir(result); 
} 

function tasks() { 
    console.log('Start executing tasks'); 
    var tasks = []; 

    tasks.push(function(_callback) { // the _callback here overrides the one above for this closure 
     console.log('Getting some data'); 
     _callback(null, result); 
    }); 
    // ... more tasks 

    async.series(tasks, function(){ 
     console.log('All done'); 
    }); 
} 

Если вы хотите повторно использовать логику в вашей _callback функции, я рекомендовал бы передавая ему async обратного вызова в качестве параметра:

// rename some functions to avoid silly js scoping mysteries 
function myCallback(err, result, asyncCallback){ 
    // shared logic here 
    if(err) console.log('Error Occurred'); 
    console.log('Callback called'); 
    console.dir(result); 

    asyncCallback(null, result); 
} 

// ... 

tasks.push(function(asyncCallback) { // the _callback here overrides the one above for this closure 
    console.log('Getting some data'); 
    myCallback(null, result, asyncCallback); 
}); 
// ... more tasks 

async хочет его обратного вызова будет называться так знает, когда для продолжения, но это не означает, что вы не можете перехватить его своими собственными обработчиками: P.

Смежные вопросы