2017-08-28 11 views
0

エクスプレスサーバコントローラとリファクタリングをpromisesからasync/awaitに変更しています。機能のいくつかについては、私はそれのためだけにそれをやっているのか分かりません。それ以上読み込みができない場合、私はまだそれを行う必要がありますか?Promises => Async/Await ....これには何か利点がありますか?

はここに例を示します

async sharedTroop(req, res, next) { 
    const firebaseUID = req.params.uid; 

    try { 
     const user = await User.findOne({ firebaseUID }).select('troopPointTotal'); 

     user.troopPointTotal += 1000; 

     try { 
     user.save(); 
     try { 
      res.send(user); 
     } catch (e) { 
      next(e); 
     } 
     } catch (e) { 
     next(e); 
     } 
    } catch (e) { 
     next(e); 
    } 
    } 

は(async/awaitを使用して)上記は、このオーバーどんな利点を持っています

sharedTroop(req, res, next) { 
    const firebaseUID = req.params.uid; 

    User.findOne({ firebaseUID }) 
     .select('troopPointTotal') 
     .then(user => { 
     user.troopPointTotal += 1000; 
     user.save().then(() => res.send(user)); 
     }) 
     .catch(next); 
    }, 

を?:そしてリファクタリングは読みやすさを改善していない場合、私は気にはなりません?

ありがとうございます!

+0

@downvoters:コメントをお願いします – ideaboxer

+0

非必須のコーディングスタイルを処理できない人もいますが、async/awaitはもっと重要なスタイルを可能にしますが、これは意見です –

答えて

2

短い答えいいえ、async/awaitは、then/catchで書いたコードの文法上の砂糖です。

唯一のメリットは、あなたの目で注文することです。コールバックは必要ありません。「同期」コードスタイルを模倣します。

3

巣に理由try文はありません:

async sharedTroop(req, res, next) { 
    const firebaseUID = req.params.uid; 
    try { 
    const user = await User.findOne({ firebaseUID }).select('troopPointTotal'); 
    user.troopPointTotal += 1000; 
    user.save(); 
    res.send(user); 
    } catch(e) { 
    next(e); 
    } 
} 

これは確かにあなたのthenソリューションのネストされたコールバックよりもかなり良く見えるかもしれません。また、あなたの間違いを簡単に修正できます。awaitの結果をuser.save()に送信してから、応答を送信してから、catchが暗黙的に保存プロセスのエラーを処理します。対照的に、thenバージョンも同様の誤りがあります。returnの結果では、user.save().then(() => res.send(user))というコールバックからの結果では、最後に.catch()のエラーは処理されません。

リファクタリングで読みやすさが向上していない場合は、どうしたらいいですか?

確かに、読みやすさは主観的であり、利点がないと考えるならば、反応炉に気を付けるべきではありません。

+0

ありがとう!上のコードでは、 'user.save()'や 'res.send(user)'の結果を待っていないことに気付きました。これはすべきか? –

+0

@MattCleary質問のコードもどちらもなかったので私はしませんでした。しかし、はい、私はあなたが* '* user.save()を待つべきであることをかなり確信しています。 'send'は約束を返さないので、待つことは何もない。 – Bergi

+0

、ありがとう! –

関連する問題