【问题标题】:Async loop inside promise - how to keep order承诺中的异步循环 - 如何保持秩序
【发布时间】:2018-01-23 22:34:42
【问题描述】:

在渲染页面之前,我需要确保从 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');
                }
            });
        });
    };

当我这样称呼时:

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

结果是:

  //All users saved
  //Async each done

我无法找出正确的结构来保持 then() 链中的正确顺序。

【问题讨论】:

  • 不熟悉 async 方法,但我想您需要创建一个新的 Promise,在回调中解决(或拒绝)它,然后返回 Promise。或者改用Promise.all,也许?

标签: javascript node.js express fetch async.js


【解决方案1】:

getAllUsers.then 的回调应该返回一个承诺。否则,将在 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" ) );

【讨论】:

  • 补充一点,因为他已经在使用 promises 并且 mongoose 也支持它们,他应该使用 promise.all + data.map 或 data.reduce 而不是 async.each
  • resolve() 是我想要的。这个解决方案对我有用,非常感谢@vox!
猜你喜欢
  • 2017-10-30
  • 2017-07-18
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多