【问题标题】:sequelize ORM asynchronous method calls续集 ORM 异步方法调用
【发布时间】:2017-11-10 22:08:19
【问题描述】:

sequelize ORM 中如何异步调用方法? (因为我必须在其他方法中使用返回值)。

user.dao.js:

var User = require('./user.model');

class UserDao {
constructor() {}

insert(user) {
    var pk;
    User.sync({ force: false }).then(() => {
        User.create(user).then(function(user) {
            console.log('Entry successful from dao: ' + 
    JSON.stringify(user));
            //return generated pk
            pk = user.id;
            console.log('ID: ' + pk);
        });
    });
    return pk;
}

user.test.js:

class UserDaoTest {
constructor() {
    this.userDao = new UserDao();
    this.compare = new UtilsObject();
}

/*
    all CRUD method calls
*/
testAll() {
    this.testInsert();
    this.testUpdate();
    //this.testDelete();
    //this.testRead();
    //this.compare();
}

/*
    insert method
*/
testInsert() {
    // composite form
    var user = {
        name: 'nisha',
        email: 'nisha@gmail.com',
        phoneNo: 8978,
        picUrl: 'nisha',
        description: 'SI',
        status: 'active',
        waitingTime: 10,
        rating: 7
    };

    /*
        calling insert user with above data
    */
    var pk = this.userDao.insert(user);
    console.log('pk value: ' + pk);
    //var obj1 = this.userDao.readById(pk);
    console.log('obj1 value: ' + user);
    //this.testReadById(obj1);
}

testReadById(obj1) {
    var obj2 = this.userDao.readById(obj1);
    this.compare.compare(obj1, obj2);
    this.testDelete(obj1);
}
}

export default UserDaoTest;

在 user.test.js 中,在 testInsert() 方法中想要获取从 user.dao.js 的 insert() 方法返回的 pk 的值,但现在我得到的 pk 值未定义。

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    使用承诺链。 假设您需要获取特定用户的条目并对其进行一些操作。

    Model.User.findById(someId)
    .then((user) => {
       // Do something with user.
    })
    

    你不应该同步调用方法,NodeJs 不是这样设计的。它适用于回调或承诺。

    【讨论】:

      【解决方案2】:

      您的代码无法运行,因为它是异步代码。

      观看著名的Youtube video about the event loop

      但简而言之,如果您将运行以下示例,它就像您的代码但没有您的逻辑:

      var User = require('./user.model');
      
      class UserDao {
      constructor() {}
      
      insert(user) {
          var pk; 
          console.log('1');
          User.sync({ force: false }).then(() => {
              pk = 123;
              console.log('3'); 
          });
          console.log('2');
          return pk; 
      }
      

      变量pk 将是undefined,您的控制台将如下所示:

      1
      2
      3
      

      如果你想让它工作,你应该“等待”这样的异步函数:

      var User = require('./user.model');
      
      class UserDao {
          constructor() {}
      
          // @return Promise
          insert(user) {
               return User.sync({ force: false }).then(() => {
                   return User.create(user)
               }).then((user) => {
                   console.log('Entry successful from dao: ' + JSON.stringify(user));
                   return user.id
               })
          }
      

      当你使用它时:

      class UserDaoTest {
          constructor() {
              this.userDao = new UserDao();
              this.compare = new UtilsObject();
          }
      
          /*
              all CRUD method calls
          */
          testAll() {
              // if testInsert and testUpdate can run simultaneously you can keep it like this. 
              // Otherwise, use Promise.then as well
              this.testInsert();
              this.testUpdate(); 
          }
      
          /*
              insert method
          */
      
          testInsert() {
              var user = {
                  // ...
              };
      
              /*
                  calling insert user with above data
              */
              this.userDao.insert(user).then((userId) => {
                  // YOUR COMPARE CODE
              }).then(done); // Where done is a function to let you test framework that you async code is done
          }
      }
      
      export default UserDaoTest;
      

      另一种方法是使用新的asyncawait。这样,您将获得更具可读性和可维护性的代码。

      您可以阅读更多here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 2015-11-28
        • 2020-01-17
        相关资源
        最近更新 更多