Подтвердить что ты не робот

Цепочка Promises в Coffeescript

Есть ли способ связать Promises вместе в Coffeescript. Например, рассмотрим следующий код javascript,

return $.getJSON('/api/post.json')
  .then(function(response) {
    // do something
  })
  .then(function(response) {
    // do something
  })
  .then(null, function(err) {
    // do something
  });

Каждый из then's является необязательным, и конечная then должна быть возвращена функцией. В настоящее время я пишу это в coffeescript как

promise = $.getJSON('/api/post.json')
promise = promise.then (response) ->
  // do something

promise = promise.then (response) ->
  // do something

promise = promise.then null, (err) ->
  // do something

return promise

Есть ли лучший способ сделать это? Спасибо.

4b9b3361

Ответ 1

Иезекииль показывает правильный путь, но ему не нужны круглые скобки вокруг функций. Просто выполните:

$.getJSON '/api/post.json' # As of CoffeeScript 1.7, you don't need the parentheses here either.
.then (response) ->
  # do something
  response # if you would not return anything, promise would be fulfilled with undefined
.then (response) ->
  # do something
  undefined # necessary to prevent empty function body
.then null, (err) ->
  # handle error

Я думаю, что это удивительно чисто. Единственное, что относительно беспорядочно, - это когда вы должны одновременно добавлять onRejected и onFulfilled обработчики.

Примечание. В прошлый раз, когда я проверил, это не сработало в CoffeeScript Redux, но это было несколько месяцев назад.

Примечание 2. Для этого вам нужно, по крайней мере, одна строка фактического кода (т.е. не только комментарий) в каждом теле функции. Как правило, вы будете, поэтому это не большая проблема.

Ответ 2

Это мой личный любимый способ написать promises с небольшим дополнительным отступом

doSomething = () -> new RSVP.Promise (resolve, reject) ->
  if 1 is 1
    resolve 'Success'
  else
    reject 'Error'

doSomething()
.then (res) ->
      console.log 'Step 1 Success Handler'

    , (err) ->
      console.log 'Step 1 Error Handler'

.then (res) ->
      console.log 'Step 2 Success Handler'

.then (res) ->
      console.log 'Step 3 Success Handler'

    , (err) ->
      console.log 'Step 3 Error Handler'

Что компилируется:

var doSomething;

doSomething = function() {
  return new RSVP.Promise(function(resolve, reject) {
    if (1 === 1) {
      return resolve('Success');
    } else {
      return reject('Error');
    }
  });
};

doSomething().then(function(res) {
  return console.log('Step 1 Success Handler');
}, function(err) {
  return console.log('Step 1 Error Handler');
}).then(function(res) {
  return console.log('Step 2 Success Handler');
}).then(function(res) {
  return console.log('Step 3 Success Handler');
}, function(err) {
  return console.log('Step 3 Error Handler');
});

Есть случаи, когда это тоже очень хорошо работает:

step1Success = (res) -> console.log 'Step 1 Success Handler'
step1Error   = (err) -> console.log 'Step 1 Error Handler'

step2Success = (res) -> console.log 'Step 2 Success Handler'

step3Success = (res) -> console.log 'Step 3 Success Handler'
step3Error   = (err) -> console.log 'Step 3 Error Handler'

doSomething()
  .then(step1Success, step1Error)
  .then(step2Success)
  .then(step3Success, step3Error)

Протестировано на кофе script v1.6.3

Ответ 3

Это, вероятно, лучшее, что вы сделаете:

$.getJSON('/api/post.json')
    .then( (response) ->
      # do something
    ).then( (response) ->
      # do something
    ).then null, (err) ->
      # do something

Обратите внимание на круглые скобки, окружающие аргументы then(). Ничто не разрушает землю, но, надеюсь, это помогает.