Я привык обещать цепочки массивов. Невероятно легко читать цепочку обещаний, когда каждое обещание длинное, например
myArray.map(x => convertX)
.filter()
.whatever()
.etc()
Это невероятно легко читать. Однако, когда я создаю цепочки обещаний с пользовательскими функциями, он становится намного более беспорядочным.
database.query(first query)
.then(results => {
// do stuff
// do more
// even more
return database.query(second query)
})
.then(results => {
// rinse and repeat
})
.catch(err => {
// error handling
})
Теперь это может быть разборчивым, но когда цепочка обещаний распространяется дальше, она становится немного. Если я сделаю каждое обещание своей собственной функцией, тогда я могу оптимизировать процесс, чтобы код выглядел примерно так (что imo, на 1000 раз больше разборчиво).
db.query(first query)
.then(storeFirstQuery)
.then(secondQueryAndStoreIt)
.then(thirdQueryAndStoreIt)
.catch(errHandlingFunction)
Таким образом, я могу изменить функции без необходимости манипулировать значениями, которые передаются от одного обещания к следующему. Если обещание использует результат другого, оно должно быть только после другого, но не сразу после. Таким образом я могу прокрасться promises туда, где мне нужно.
Однако для этого требуется, чтобы моя цепочка обещаний использовала переменные за пределами каждой области обещания. Есть ли проверенный и надежный способ сделать это?
Изменить - Кажется, что async
/await
- лучший способ сделать это, но я запускаю Node на Heroku, и он еще не поддерживается:/