2013-07-23 2 views
0

Я изучаю coffeescript и использую его с node.js, создавая базовый rest api на express.js.Coffeescript + Node.js: альтернативы обратным вызовам

Я начинаю понимать, что мой код покрывается несколькими слоями обратных вызовов. Некоторый googling показал мне, что есть некоторые альтернативы, такие как обещания, фьючерсы и генераторы.

  1. Я новичок в этих условиях. Не могли бы вы объяснить это на непрофессиональных условиях?
  2. Может ли любой из них использоваться в Coffeescript? Если это так, я бы очень признателен за некоторые ресурсы, чтобы изучить его.
  3. У вас есть предпочтение среди них?
+1

1. Google работает лучше для этого типа вопрос. 2. Да, все javascript-конструкции могут использоваться в coffeescript. 3. Здесь есть несколько лагерей, но пуристы-узлы придерживаются простых старых обратных вызовов. –

ответ

0

Посмотрите на async.js (https://github.com/caolan/async) не вводят новые понятия, но позволяет рационализировать обратный вызов суп в нечто более управляемое и читаемое. Например, вместо

foo(data, (err, result) -> 
    bar(result, (err, omgimtired) -> 
     foobar(omgimtired, (err....) -> 
      ... 
     ) 
    ) 
) 

Вы можете просто использовать async.waterfall и кормить его список функций для вызова один за другим.

Обещания довольно просты (если вам удастся обдумать их вокруг). Они описывают объект, который является результатом конкретной операции. Представьте, что вы возвращаете объекты из всех своих функций, которые представляют результаты. Теперь представьте, что каждый результат имеет функцию (then(...)), которая передает обратный вызов для «успешного» завершения и обратного вызова для неудачного. Легко, правда? Единственное, что делает обещания особенными, это то, что этот обратный вызов может вернуть еще одно обещание, которое должно быть выполнено в первую очередь для выполнения «прилагаемого» обещания. И так далее. Вы просто заменяете последовательность обратных вызовов цепочкой вызовов .then(...).

Parse.User.logIn("user", "pass", { 
    success: function(user) { 
    query.find({ 
     success: function(results) { 
     results[0].save({ key: value }, { 
      success: function(result) { 
      // the object was saved. 
      } 
     }); 
     } 
    }); 
    } 
}); 

против

Parse.User.logIn("user", "pass").then(function(user) { 
    return query.find(); 
}).then(function(results) { 
    return results[0].save({ key: value }); 
}).then(function(result) { 
    // the object was saved. 
}); 

От http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/

напитка этого Kool-Aid http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript из весьма основательного ответа на аналогичную тему What are the differences between Deferred, Promise and Future in JavaScript?

Смежные вопросы