Javascript 带返回函数的正确回调

Javascript 带返回函数的正确回调,javascript,node.js,Javascript,Node.js,我有三个函数,我想用适当的回调函数调用这个函数,这样值在一秒钟内从一次使用返回。问题是我的回调函数在主函数之后执行,而我期望回调函数返回值 我有三个函数saveUser、savepoter和saveArtist。所有操作都应按顺序执行,以便saveUser返回savepoter,savepoter返回saveArtist。我尝试的是 var saveUsers = function (callback) { var users = [{ name

我有三个函数,我想用适当的回调函数调用这个函数,这样值在一秒钟内从一次使用返回。问题是我的回调函数在主函数之后执行,而我期望回调函数返回值

我有三个函数saveUser、savepoter和saveArtist。所有操作都应按顺序执行,以便saveUser返回savepoter,savepoter返回saveArtist。我尝试的是

var saveUsers = function (callback) {         
    var users = [{
            name: 'xyz',
            email: 'xyz@abc.com'

        }, {
            name: 'User New',
        }],
        savedUser = [];
    console.log('Saving Users --');
    __.map(users, function (record) {
        var recordType = new User(record);
        recordType.save(function (err, result) {
            if (err) console.log(err);
            if (!err) {
                console.log('Inserted user - ' + result.name);
                savedUser.push(result._id);
            }
        });
    });
    callback(savedUser);
};


saveUsers(function (savedUsers) {
    console.log(savedUsers);
    console.log('Saving Poets --');

    var poets = [{
        name: 'First Poet',
        userId: savedUsers[0]
    }, {
        name: 'Second Poet',
        userId: savedUsers[0]
    }, {
        name: 'Third Poet',
        userId: savedUsers[0]
    }];
    __.map(poets, function (record) {
        var recordType = new Poet(record);
        recordType.save(function (err, result) {
            if (err) console.log(err);
            if (!err) {
                console.log(result);
                console.log('Inserted poet - ' + result.name);
            }
        });
    });
});


var saveArtist = function(){
    console.log();
    console.log('Saving Artist --');

    var artists = [{
        name: 'First artist',
        userId: savedUsers[0]
    }, {
        name: 'Second artist',
        userId: savedUsers[0]
    }, {
        name: 'Third artist',
        userId: savedUsers[0]
    }];
    __.map(artists, function (record) {
        var recordType = new Artist(record);
        recordType.save(function (err, result) {
            if (err) console.log(err);
            if (!err) {
                console.log(result);
                console.log('Inserted artist - ' + result.name);
            }
        });
    });
}
您正在尝试将synchronous
.map
与asynchronous
一起使用。save
这是错误的方法,在这种情况下,您需要使用类似(
npm i async
)的库,如下所示

var async = require('async');

var saveUsers = function(callback) {
  var users = [{
      name: 'xyz',
      email: 'xyz@abc.com'
    }, {
      name: 'User New',
    }];

  async.mapSeries(users, function (record, next) {
    new User(record).save(function (err, result) {
      if (err) {
        return next(err);
      }

      console.log(result);
      console.log('Inserted poet - ' + result.name);
      next(result);
    });
  }, function (err, users) {
    if (err)  {
      return callback(err);
    }

    callback(users.map(function (user) {
      return user._id;
    }));
  });
};


function savePoets(users, callback) {
  var poets = [{
    name: 'First Poet',
    userId: users[0]
  }, {
    name: 'Second Poet',
    userId: users[0]
  }, {
    name: 'Third Poet',
    userId: users[0]
  }];

  async.eachSeries(poets, function (record, next) {
    new Post(record).save(function (err, result) {
      if (err) {
        return next(err);
      }

      console.log(result);
      console.log('Inserted poet - ' + result.name);
      next();
    });
  }, function (err) {
    if (err)  {
      return callback(err);
    }

    callback();
  });
}

function saveArtists(users, callback) { 
  var artists = [{
    name: 'First artist',
    userId: users[0]
  }, {
    name: 'Second artist',
    userId: users[0]
  }, {
    name: 'Third artist',
    userId: users[0]
  }];

  async.eachSeries(poets, function (record, next) {
    new Artist(record).save(function (err, result) {
      if (err) {
        return next(err);
      }

      console.log(result);
      console.log('Inserted poet - ' + result.name);
      next();
    });
  }, function (err) {
    if (err)  {
      return callback(err);
    }

    callback();
  });
}

async.waterfall([
  function (next) {
    saveUsers(next);
  }, 
  function (users, next) {
    async.parallel([
      function (next) {
        savePoets(users, next);
      },

      function (next) {
        saveArtists(users, next);
      }
    ], next);
  }
], function (err) {
  if (err) {
    return console.log(err);
  }

  console.log('Done');
});

为什么要使用
map
在数组中循环?我希望逐个保存记录。map用于复制新数组。你应该使用每个。好的。我会改变它。我将如何处理回调到其他的函数?