2016-03-03 5 views
6

Ich habe innere Funktionen mit Callback verschachtelt, die mit in der einzigen Funktion (abcd) sind.Knoten js + mehrere verschachtelte innere Funktionen mit Callback

muss ich von außen mit Asynchron-ABCD-Funktion aufrufen und die Antwort zurück.

var listFunctions = { 
    test1 : function(objectData, callbackData) { 
     //have logic and retrun data 
     callbackData(null, "a"); 
    }, 
    test2 : function(objectData, callbackData) { 
     //have logic and retrun data 
     callbackData(null, "b"); 
    }, 
    test3 : function(objectData, callbackData) { 
     //have logic and retrun data 
     callbackData(null, "c"); 
    }, 
    test4 : function(objectData, callbackData) { 
     //have logic and retrun data 
     callbackData(null, "d"); 
    }, 
    test5 : function(objectData, callbackData) { 
     //have logic and retrun data 
     callbackData(null, "e"); 
    } 
}; 

function abcd(objectData, clb) { 

    listFunctions.test1(objectData, function(err, data1) { 
     listFunctions.test1(data1, function(err, data2) { 
      listFunctions.test1(data2, function(err, data3) { 
       listFunctions.test1(data3, function(err, data4) { 
        listFunctions.test1(data4, function(err, data5) { 
         return clb; 
        }); 
       }); 
      }); 
     }); 
    }); 
}; 

Datenobjekt in Array

var objectData = [{"id":1, "name" : "abcd"},{"id":2, "name" : "abc2d"},{"id":3, "name" : "3abcd"},{"id":4, "name" : "4abcd"}]; 

initalFunction(objectData, function(response) { 
    console.log(response); 
}); 

function initalFunction(objectData, result) { 

    async.each(objectData, function(dataValues, callback) { 
     abcd(dataValues, function(response) { 
      console.log(response); 
     }); 

    }, function(err) { 
     return result; 
     //Need to re 
    }); 
} 

brauchen alle Array von Objekten unter Verwendung js async initalFunction Funktion Knoten iterieren.

In oben ich meinen Code hinzugefügt, schlagen Sie die richtige Art und Weise.

Antwort

0

Ich bin nicht sicher, ob ich verstanden, was genau Sie versuchen zu erreichen, aber ich werde es versuchen.

Das erste Problem ist, dass Sie nicht return einen Wert für Ihre äußere Funktion innerhalb einer inneren Callback-Funktion (siehe https://stackoverflow.com/a/6847754/3173842 für weitere Informationen dazu).

Zusätzlich kehren Sie die Callback-Funktion nicht das Ergebnis.

Dies ist, was ich glaube, Sie eigentlich tun wollte:

var async = require("async"); 

var listFunctions = { 
    test1: function(objectData, callbackData) { 
     objectData.name += ":a"; 
     callbackData(null, objectData); 
    }, 
    test2: function(objectData, callbackData) { 
     objectData.name += ":b"; 
     objectData.foo = "bar"; 
     callbackData(null, objectData); 
    }, 
    test3: function(objectData, callbackData) { 
     objectData.name += ":c"; 
     callbackData(null, objectData); 
    }, 
    test4: function(objectData, callbackData) { 
     objectData.name += ":d"; 
     callbackData(null, objectData); 
    }, 
    test5: function(objectData, callbackData) { 
     objectData.name += ":e"; 
     callbackData(null, objectData); 
    } 
}; 

function abcd(objectData, cb) { 
    listFunctions.test1(objectData, function(err, data1) { 
     listFunctions.test2(data1, function(err, data2) { 
      listFunctions.test3(data2, function(err, data3) { 
       listFunctions.test4(data3, function(err, data4) { 
        listFunctions.test5(data4, function(err, data5) { 
         cb(err, data5); 
        }); 
       }); 
      }); 
     }); 
    }); 
} 

function initalFunction(objectData, cb) { 
    var results = []; 

    async.each(objectData, function(dataValues, done) { 
     abcd(dataValues, function(err, response) { 
      results.push(response); 
      done(); 
     }); 
    }, function(err) { 
     cb(err, results); 
    }); 
} 

var objectData = [{id:1,name:"abcd"},{id:2,name:"abc2d"},{id:3,name:"3abcd"},{id:4,name:"4abcd"}]; 

initalFunction(objectData, function(err, response) { 
    if (err) { 
     console.log(err.stack); 
     return; 
    } 
    console.log("Result:", response); 
}); 

Jetzt können Verwendung async.seq und async.map dazu vereinfachen:

var async = require("async"); 

var listFunctions = { 
    test1: function(objectData, callbackData) { 
     objectData.name += ":a"; 
     callbackData(null, objectData); 
    }, 
    test2: function(objectData, callbackData) { 
     objectData.name += ":b"; 
     objectData.foo = "bar"; 
     callbackData(null, objectData); 
    }, 
    test3: function(objectData, callbackData) { 
     objectData.name += ":c"; 
     callbackData(null, objectData); 
    }, 
    test4: function(objectData, callbackData) { 
     objectData.name += ":d"; 
     callbackData(null, objectData); 
    }, 
    test5: function(objectData, callbackData) { 
     objectData.name += ":e"; 
     callbackData(null, objectData); 
    } 
}; 

var abcd=async.seq.apply(null, [ 
    listFunctions.test1, 
    listFunctions.test2, 
    listFunctions.test3, 
    listFunctions.test4, 
    listFunctions.test5 
]); 

function initialFunction(objectData, cb) { 
    async.map(objectData, abcd, cb); 
} 

var objectData = [{id:1,name:"abcd"},{id:2,name:"abc2d"},{id:3,name:"3abcd"},{id:4,name:"4abcd"}]; 

initialFunction(objectData, function(err, response) { 
    if (err) { 
     console.log(err.stack); 
     return; 
    } 
    console.log("Result:", response); 
}); 

Wenn Sie listFunctions vom Objekt zum Array ändern können :

var async = require("async"); 

var listFunctions = [ 
    function test1(objectData, callbackData) { 
     objectData.name += ":a"; 
     callbackData(null, objectData); 
    }, 
    function test2(objectData, callbackData) { 
     objectData.name += ":b"; 
     objectData.foo = "bar"; 
     callbackData(null, objectData); 
    }, 
    function test3(objectData, callbackData) { 
     objectData.name += ":c"; 
     callbackData(null, objectData); 
    }, 
    function test4(objectData, callbackData) { 
     objectData.name += ":d"; 
     callbackData(null, objectData); 
    }, 
    function test5(objectData, callbackData) { 
     objectData.name += ":e"; 
     callbackData(null, objectData); 
    } 
]; 

function initialFunction(objectData, cb) { 
    async.map(objectData, async.seq.apply(null, listFunctions), cb); 
} 

var objectData = [{id:1,name:"abcd"},{id:2,name:"abc2d"},{id:3,name:"3abcd"},{id:4,name:"4abcd"}]; 

initialFunction(objectData, function(err, response) { 
    if (err) { 
     return console.error(err.stack); 
    } 
    console.log("Result:", response); 
}); 

wenn nicht, müssen aber noch zu handhaben dynamische listFunctions:

function initialFunction(objectData, cb) { 
    var list = Object.keys(listFunctions).map(function(name) { 
     return listFunctions[name]; 
    }); 
    async.map(objectData, async.seq.apply(null, list), cb); 
} 

Ich hoffe, das hilft.