CoffeeScript — должен ли у меня быть обратный вызов?

#javascript #callback #coffeescript

#javascript #обратный вызов #coffeescript

Вопрос:

Я работаю над этим простым классом CoffeeScript в учебных целях и пытаюсь выяснить, должен ли мой метод getMutant иметь обратный вызов. Код, похоже, работает как есть, но в будущем я хотел бы, возможно, запросить базу данных или какое-либо другое своевременное асинхронное событие. Как бы мне написать обратный звонок здесь?

Спасибо!

 class Mutant
    @MutantArray: []

    constructor: (@name, @strength = 1, @agility = 1) ->
        @name = @name.toLowerCase(@name)
        Mutant.MutantArray.push(@)

    attack: (opponentName) ->
        opponentName = opponentName.toLowerCase(opponentName)

        # Should the method below have a callback since I'm using the result directly below?
        opponentExists = Mutant.getMutant(opponentName)

        if opponentExists then alert @name   " is attacking "   opponentName else alert "No Mutant by the name of '"   opponentName   "' found."

    @getAllMutants: () ->
        @MutantArray

    # Possibly need to add callback?
    @getMutant: (name) ->
        result = (mutant.name for mutant in Mutant.MutantArray when mutant.name is name)
        if result.length > 0 then mutant else null

Wolverine = new Mutant("Wolverine", 1, 2)
Rogue = new Mutant("Rogue", 5, 6)

Rogue.attack("Wolverine")

Mutant.getAllMutants()
 

Ответ №1:

Ну, этот вопрос немного основан на мнениях, поэтому он может быть отклонен.

Я все же попробую это сделать. Если у вас есть какое-либо хранилище резервных копий за пределами вашего кода, вам нужно будет иметь там несколько обработчиков асинхронности — каждый раз, когда вы переходите к сети / вводу-выводу / базе данных, вы выполняете асинхронность. Я не думаю, что действительно правильно помещать getAllMutants внутри вашего Mutant класса. Я адаптировал часть своего существующего кода, чтобы он был getAllMutants функцией из MongoDB.

 getAllMutants: (onError, onSuccess) =>
  MongoClient.connect @config.dbUrl, (err, db) =>
    if err?
      onError("Failed: #{JSON.stringify err}")
    else
      collection = db.collection(@config.collection)
      collection.find().toArray( (err, mutants) ->
        if err?
          onError(err)
        else
          unless mutants?
            onError("No mutants object found")
          unless mutants.length?
            onError("No mutants object returned or not an array")
          else
            onSuccess(mutants)
            db.close()
      )