2017-07-22 28 views
0

約束を使ってコードをリファクタリングしています。私は問題に遭遇している。 APIルートは2つあります。最初はapi.js、2番目はaccount.jsです。私は4つのコントローラ(CommentController、ZoneController、ProfileController、AccountController)も持っています。別の約束を呼び出すことを約束したAPI約束

CommentController、ZoneController、ProfileControllerは同じAPIルート(api.js)を共有します。

account.jsはAccountControllerを使用します。しかし、AccountControllerのメソッドはProfileControllerのメソッドを使用します。

プロミスに別のプロミスを呼び寄せてしまったが、データが正しく返されていない。サーバーがぶら下がっています。あるPromiseが別のPromiseを呼び出しているときに、どのようにデータを返すことができますか? account.jsは、ProfileController.jsを呼び出すメソッドを持つAccountController.jsを呼び出していますが、AccountControllerとProfileControllerの両方がPromiseにリファクタリングされています。私はデータを取り戻していない。助けてください。

AccountController.js 

var ProfileController = require('./ProfileController'); 

module.exports = { 

    currentUser: function(req) { 
    return new Promise(function(resolve, reject) { 
     if (req.session == null) { 
     reject({message: 'User not logged in'}); 
     return; 
     } 

     if (req.session.user == null) { 
     reject({message: 'User not logged in'}); 
     return; 
     } 

     ProfileController.findById(req.session.user, function(err, result) { 
     if (err) { 
      reject({message: 'fail'}); 
      return; 
     } 
     resolve(result); 
     return; 
     }); 
    }); 
    } 

ProfileController.js 

    findById: function(id) { 
    return new Promise(function(resolve, reject){ 
     Profile.findById(id, function(err, profile){ 
     if(err){ 
      reject(err); 
      return; 
     } 
     resolve(profile); 
     return; 
     }); 
    }) 
    }, 

account.js 

router.get('/:action', function(req, res, next) { 

    var action = req.params.action; 

    if (action == 'logout') { 
    req.session.reset(); 
    res.json({ 
     confirmation: 'success', 
     message: 'Bye!' 
    }); 
    return; 
    } 

    if (action == 'login') { 
    res.json({ 
     confirmation: 'success', 
     action: action 
    }); 
    return; 
    } 

    if (action == 'currentuser') { 
    AccountController.currentUser(req) 
     .then(function(result){ 
     res.json({ 
      confirmation: 'success', 
      user: result 
     }); 
     return; 
     }) 
     .catch(function(err){ 
     res.json({ 
      confirmation: 'fail', 
      message: err.message 
     }); 
     return; 
     }); 

    } 
}); 
+1

を変更する必要がありますが、あなたはProfileController' 'であなたのリファクタリング' findById'機能を使用するためにAccountController' 'であなたの' currentUser'機能を変更するのを忘れたようです:あなたはコールバックを渡していますが、 'findById'は単一の' id'引数だけを期待しています –

+0

期待している出力の種類がわからないので、いくつかのテストケースを含めてください。 –

+0

私の問題を見てくれてありがとう。カーミット解を解く。 –

答えて

0

あなたはAccountController.js

AccountController.js 
 

 
var ProfileController = require('./ProfileController'); 
 

 
module.exports = { 
 

 
    currentUser: function(req) { 
 
    return new Promise(function(resolve, reject) { 
 
     if (req.session == null) { 
 
     reject({message: 'User not logged in'}); 
 
     return; 
 
     } 
 

 
     if (req.session.user == null) { 
 
     reject({message: 'User not logged in'}); 
 
     return; 
 
     } 
 

 
     ProfileController.findById(req.session.user).then(
 
     function (profile){ 
 
     resolve(profile); 
 
     },function (err) { 
 
     reject(err); 
 
     }); 
 
    }

+0

promiseのresolve関数が実行されているときに最初の関数が呼び出され、promiseのreject関数が実行されているときに2番目の関数が呼び出されます – Kermit

+0

aww ..ソリューションがなぜ機能するのか説明できますか?再度、感謝します。 –

+0

@Kermitコメントに説明を追加する代わりに、あなたの答えを編集することができます。 –