Можно ли упростить асинхронный код на Promise?

Не могу сообразить: можно ли написать это проще?
Promise.resolve()
.then(@getObjectDescription.bind(@))
.then(
	(someObject) =>
		new Promise (resolve, reject) =>
			Promise.resolve()
			.then(@getSomeSpecialFieldValue.bind(@))
			.then(
				(value) ->
					someObject.special_field = value
			)
			.then(resolve.bind(null, someObject))
			.catch(reject)
)
.then(
	(someObject) ->
		data = new FormData()

		data.append('field', someObject.field)
		data.append('special_field', someObject.special_field)

		options =
			method: 'post'
			body: data

		return options
)
.then(@execute.bind(@, 'rest.api.method'))


Суть в том, что getObjectDescription() в какой-то момент резолвит объект. Потом нужно заполнить у этого объекта одно поле особым образом через асинхронный запрос значения. А потом нужно с этим же объектом работать дальше.
И вот эта функция, вызываемая после изначального получения объекта, мне не очень нравится тем, что необходимо создавать вложенный promise.

P.S. Для тех, кто не знаком с CoffeeScript: @ - это this. Остальное должно быть интуитивно понятно.
  • Вопрос задан
  • 562 просмотра
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Вынесите someObject в замыкание и внутреннюю цепочку промисов перенесите во внешнюю
someObject = null //не знаю можно ли писать в cs var поэтому так
Promise.resolve()
.then(@getObjectDescription.bind(@))
.then(
  (so) ->
    someObject = so
)
.then(@getSomeSpecialFieldValue.bind(@))
.then(
        (value) ->
          someObject.special_field = value
          return someObject
)
.then(
  (someObject) ->
    data = new FormData()

    data.append('field', someObject.field)
    data.append('special_field', someObject.special_field)

    options =
      method: 'post'
      body: data

    return options
)
.then(@execute.bind(@, 'rest.api.method'))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы