2016-03-03 48 views
6

我有嵌套的內部函數與單一函數(abcd)中使用的回調。節點js +多個嵌套的內部函數與回調

我需要從外部使用異步調用abcd函數並返回響應。在陣列

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 
    }); 
} 

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; 
        }); 
       }); 
      }); 
     }); 
    }); 
}; 

數據對象需要迭代使用JS異步使用initalFunction功能節點對象的所有數組。

在上面我添加了我的代碼,請建議正確的方法。

回答

0

我不知道我是否明白你想要達到的目標,但我會試一試。

第一個問題是,您不能在內部回調函數中爲您的外部函數設置return值(有關此信息的更多信息,請參見https://stackoverflow.com/a/6847754/3173842)。

此外,您正在返回回調函數而不是結果。

這是我想到你居然想做的事:

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); 
}); 

現在讓我們使用async.seqasync.map來簡化這個:

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); 
}); 

如果能夠從對象改變listFunctions數組:

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); 
}); 

如果沒有,但仍然需要處理動態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); 
} 

我希望這有助於。