2017-11-09 16 views
0

ORMを続行してメソッドを非同期で呼び出すにはどうすればよいですか? (なぜなら私は他のメソッドの中で返された値を使わなければならないからです)。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: '[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; 

ここuser.test.jsで、て、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; 
} 

を変数pkundefinedとあなたのコンソールになります

1 
2 
3 

この機能を使用するには、非同期関数lを待つ必要があります。 IKEこの:

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

関連する問題