javascript - Chaining callbacks in a custom-made for-each loop, supporting both synchronous and asynchronous functions -
i have for_users function gets array of users web service, executes passed function f on received array, calls continuation f_then callback.
// execute f on every user, f_then. function for_users(f, f_then) { // users database, in user_array db.get_all_users(function(user_array) { // execute f on every user user_array.foreach(f); // call continuation callback f_then(); }); } when calling for_users, passing asynchronous function f parameter, f callbacks end before calling f_then. not happening in current code, user_array.foreach(f) not wait f finish before starting next iteration.
here's example of problematic situation:
function example_usage() { var temp_credentials = []; for_users(function(user) { // credentials asynchronous function // call passed callback after getting credential // database database.get_credentials(user.id, function(credential) { // ... }); }, function() { // do_something call executed before callbacks // have finished (potentially) // temp_credentials empty here! do_something(temp_credentials); }); } how can implement for_users such if f asynchronous function, f_then called when f functions completed?
sometimes, though, passed f for_users not asynchronous , above implementation suffice. there way write generic for_users implementation work intended both asynchronous , synchronous f functions?
this should work you:-
function for_users(f, f_then) { db.get_all_users(function(user_array) { var promises = []; user_array.foreach(function(user) { promises.push(new promise(function(resolve, reject) { f(user); resolve(); })); }); if (f_then) promise.all(promises).then(f_then); else promise.all(promises); } }); } simple test below:-
function for_users(f, f_then) { var users = [{id: 1}, {id: 2}, {id: 3}]; var promises = []; users.foreach(function(user) { var promise = new promise(function(resolve, reject) { f(user); resolve(); }); promises.push(promise); }) if (f_then) promise.all(promises).then(f_then); else promise.all(promises) } for_users(function(user) { console.log(user.id); }, function() { console.log('finshed') })
Comments
Post a Comment