具有返回功能的正确回调

时间:2015-10-24 13:42:37

标签: javascript node.js

我有三个函数,我想用正确的回调调用函数,所以值从一次使用返回。问题是我的回调函数在main函数之后执行,而我期望从回调函数返回值。

我有三个函数saveUser,savePoet,saveArtist。所有都应该在ssequence中执行,因此saveUser返回savePoet并将savePoet返回到saveArtist。我试过的是。

        var selectedRow = null;
var table = $('#processing').DataTable();
$('#processing tbody').on( 'click', 'tr', function (e) {
    e.stoppropagation();
    selectedRow = table.row( this ).data();
    return false;
})

$(body).click(function(){
    selectedRow = null;
});

$("#CompleteIt").click(function () {
    if(selectedRow){
        //process the request
        return true;
    }
    alert("No row is slected");
})

1 个答案:

答案 0 :(得分:2)

您正在尝试使用 synchronized .map异步 .save这是错误的方式,在这种情况下,您需要使用像{{3这样的库} {(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');
});