Callback after for-loop finishes in node.js

前端 未结 3 1479
被撕碎了的回忆
被撕碎了的回忆 2020-12-15 13:10

I need some help with the asynchronous nature of node.js. I have a for loop, which collects data from the database. \"result\" is an array, which should then be returned to

相关标签:
3条回答
  • 2020-12-15 13:53

    Using ES6 Promises (a promise library can be used for older browsers):

    Process all requests guaranteeing synchronous execution (e.g. 1 then 2 then 3)

    function asyncFunction (item, cb) {
      setTimeout(() => {
        console.log('done with', item);
        cb();
      }, 100);
    }
    
    let requests = [1, 2, 3].reduce((promiseChain, item) => {
        return promiseChain.then(new Promise((resolve) => {
          asyncFunction(item, resolve);
        }));
    }, Promise.resolve());
    
    requests.then(() => console.log('done'))
    

    Process all async requests without "synchronous" execution (2 may finish faster than 1)

    let requests = [1,2,3].map((item) => {
        return new Promise((resolve) => {
          asyncFunction(item, resolve);
        });
    })
    
    Promise.all(requests).then(() => console.log('done'));
    

    I did it on that way

    Promise.all(body.schedules.map(function(scheduleId) {
            return new Promise(function(resolve, reject) {
                return scheduleSchema.findOneAndRemove({
                        _id: scheduleId
                    })
                    .then(function() {
                        logSchema.insert({
                            userId: req.user.id,
                            actId: constants.LOG_SCHEDULE_DELETE.id,
                            extData: scheduleId
                        });
                        resolve();
                    })
                    .catch(function(err) {
                        reject(err);
                    });
            });
        })).then(function() {
            return res.json({
                code: constants.SUCCESS_CODE
            });
        }).catch(function(err) {
            return res.json(constants.DATABASE_ERROR);
        });
    

    The last example

    function callback (result) { console.log('all done'); }
    
    [1, 2, 3].forEach((item, index, array) => {
      asyncFunction(item, () => {
        if (index === array.length - 1) {
          callback();
        }
      });
    });
    

    This does not guarantee that callback will execute after all items are processed. It only guarantees that callback will execute after the very last item is processed.

    More information

    Michael.

    0 讨论(0)
  • 2020-12-15 14:05

    You might want to consider using helper library like async https://github.com/caolan/async

    It helps keep code more consistent..

    In your case, you can look at the forEach() method

    forEach(arr, iterator, callback)
    

    The iterator is called with an item from the list and a callback for when it has finished.

    Checkout the unit tests for examples

    https://github.com/caolan/async/blob/master/mocha_test/each.js

    0 讨论(0)
  • 2020-12-15 14:05

    With v1.5.2 of Async.js, It is each.

    each(arr, iterator, [callback])
    

    arr - An array to iterate over.
    iterator(item, callback) - A function to apply to each item in arr.
    callback(err) - Optional. A callback which is called when all iterator functions have finished, or an error occurs.

    0 讨论(0)
提交回复
热议问题