2017-11-09 2 views
0

어떻게 ORM을 sequelize에서 비동기 적으로 호출 할 수 있습니까? (왜냐하면 나는 다른 메소드 내에서 반환 된 값을 사용해야하기 때문이다).ORM 비동기 메서드 호출을 sequelize

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 : 여기에서 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: '[email protected]', 
     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; 

, testInsert에서() 메소드는 PK의 값을 취득 할 user.dao.js의 insert() 메소드에서 반환되지만, 지금은 정의되지 않은 pk 값을 얻고 있습니다.

답변

1

약속 체인을 사용하십시오. 특정 사용자에 대한 항목을 가져와야한다고 가정합니다. & 일부 작업을 수행합니다. 당신은 동기 메소드를 호출하지 않아야

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

, NodeJs 이런 식으로 설계되지 않았습니다. 콜백이나 약속과 함께 작동합니다.

1

비동기 코드이므로 코드가 작동하지 않습니다.

시계 유명한 당신은 당신의 코드처럼하지만 논리없이 다음 예제를 실행하면

그러나 짧은 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 

작동 시키려면 비동기 함수 l을 기다려야합니다. 이케이 :

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 
     }) 
    } 

그리고 당신이 그것을 사용하는 경우 : 그 일을하는 또 다른 방법은 새로운 asyncawait 사용

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; 

. 그렇게하면 더 읽기 쉽고 유지 보수가 쉬운 코드를 얻을 수 있습니다.

자세히 알아보기 here

관련 문제