简体   繁体   English

Promise中的异步循环-如何保持顺序

[英]Async loop inside promise - how to keep order

Before rendering page I need to make sure that all stuff fetched from api call is saved to database. 在渲染页面之前,我需要确保从api调用中获取的所有内容都保存到数据库中。

     let saveUsersToDB = function () {
        //fetch users func
        return getAllUsers.then((data) => {
            //save to db func
            async.each(data, (user, callback) => {
                //Mongoose model
                let newUser = new User;
                //save to db
                newUser.save((err) => {
                    if (err) {
                        callback(err)
                    }
                    else {
                        callback('user saved');
                    }
                })
               // async.each callback
            }, function (err) {
                if (err) {
                    console.log('error');
                } else {
                    console.log('Async each done');
                }
            });
        });
    };

When I call this like: 当我这样称呼:

saveUsersToDB().then(()=>{
    console.log("All users saves")
})

The result is: 结果是:

  //All users saved
  //Async each done

I can't figure out proper construction to keep right order in then() chain. 我无法找出适当的构造来保持then()链中的正确顺序。

The callback for getAllUsers.then should return a promise. getAllUsers.then的回调应返回一个promise。 Otherwise the saveUsersToDB.then callback will be invoked immediately following getAllUsers. 否则,将在getAllUsers之后立即调用saveUsersToDB.then回调。

//fetch users func
let saveUsersToDB = () => getAllUsers.then( ( data ) => new Promise( ( resolve, reject ) => {

    //save to db func
    async.each( data, ( user, callback ) => {

        //Mongoose model
        let newUser = new User();

        //save to db
        newUser.save( ( err ) => {

            if ( err ) return callback( err );
            console.log( "user saved" );
            callback();

       } );

   // async.each callback

    }, function ( err ) {

        if ( err ) return reject( err );
        console.log( "all users saved" );
        resolve();

    } );

} ) );

saveUsersToDB().then( () => console.log( "done" ) );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM