2017-08-28 28 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

有些人無法處理非必要的編碼風格 - 異步/等待允許更強制性的風格 - 但這是意見 –

回答

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解決方案的嵌套回調的確好了很多。它還簡化了修復您的錯誤:在發送響應之前,您需要awaituser.save()的結果 - 然後catch將隱式處理保存過程中的錯誤。相比之下,你的版本有一個類似的錯誤:由於user.save().then(() => res.send(user))的回調結果不是,所以錯誤最終不會被.catch()處理。

如果重構沒有提高可讀性,我應該不打擾嗎?

當然,可讀性是主觀的,如果你認爲沒有優勢,那麼你不應該打擾反應堆。

+0

謝謝!我注意到在上面的代碼片斷中,你沒有'等待'user.save()'或'res.send(user)'的結果。應該這樣做嗎? –

+0

@MattCleary我沒有,因爲問題中的代碼也沒有。但是,是的,我很確定你*應該*等待user.save()'。 'send'不會返回promise,所以沒有什麼可以等待的。 – Bergi

+0

明白了,謝謝! –