2014-09-05 3 views
1

В настоящее время я больше узнаю о функциях обратного вызова и хочу создать свои собственные функции обратного вызова с успехом и неудачей.Как создать собственную функцию .then()?

Я написал для Person объекта игры рок бумаги sissors

Person = (function() { 
    function Person(name) { 
    this.name = name; 
    } 

    Person.prototype.randomRps = function() { 
    var choices, randomChoice; 
    choices = ["rock", "paper", "sissor"]; 
    return randomChoice = choices[Math.floor(Math.random() * choices.length)]; 
    }; 

    Person.rockPaperSissor = function(player1, player2) { 
    return player1.randomRps() === player2.randomRps(); 
    }; 

    return Person; 

})(); 

Я хочу назвать Person.rockPaperSissor(p1,p2).then(...), но не знаю, как я должен написать эту .then() функции цепи ее к .rockPaperSissor()

Как у jQuery есть $.get() и .success() и error() функции для цепочки.

Спасибо!

+0

Что вам нужно - это реализация обещания. Если вам удобно использовать функцию, недоступную во всех браузерах, вы можете использовать встроенную реализацию Promise, доступную в некоторых современных браузерах. –

+6

У вас нет асинхронности; для этого нет оснований. – SLaks

+1

Посмотрите на это: http://schier.co/post/method-chaining-in-javascript – jfrej

ответ

4

Вам просто нужно вернуть этот в вашей функции

Person.rockPaperSissor = function(player1, player2) { 
    this.state = player1.randomRps() === player2.randomRps(); 
    return this; 
}; 

Person.then = function() { 
    var x = this.state; 
}; 
+0

Удивительный! Это отлично работает! Что делать, если я не хочу делать «то», но вместо этого хочу делать «те же (...)» или «разные (...)»? Я бы просто выполнил оператор 'if', чтобы проверить? –

+0

К сожалению, это невозможно, я сожалею. Но я увидел, что @nrabinowitz дал более полное объяснение по поводу обещаний – patricK

3

Если предположить, что что-то в Person.rockPaperSissor является асинхронной, вам нужно вернуть какой-то объект Promise. Как отмечали другие, если результат здесь синхронный, то в этом конкретном неправильном направлении нет смысла. JQuery обеспечивает реализацию в DeferredObject; если вы хотите написать свой собственный, вам нужно будет определить, какие методы должен поддерживать этот объект.

Для того, чтобы относительно простой случай, вы могли бы сделать класс Promise, который поддерживается только .then вроде этого:

function Promise() { 
    // start unresolved 
    this.resolved = false; 
    // init list of callbacks to fire on resolution 
    this.callbacks = []; 
} 

Promise.prototype = { 
    then: function(callback) { 
     if (this.resolved) { 
      // if resolved, fire immediately 
      callback(); 
     } else { 
      // otherwise, queue up the callback for later 
      this.callbacks.push(callback); 
     } 
    }, 

    resolve: function() { 
     this.resolved = true; 
     // fire all callbacks 
     this.callbacks.forEach(function(callback) { 
      callback(); 
     }); 
    } 
}; 

Затем в функции асинхронной, вы могли бы сделать что-то вроде:

Person.rockPaperSissor = function(player1, player2) { 
    var promise = new Promise(); 

    doSomethingAsync(function callback() { 
     promise.resolve(); 
    }); 

    return promise; 
}; 

В вашем конкретном случае .then не будет супер-полезным, если вы не выставите результаты функции rockPaperSissor как постоянное состояние на Person; если вы хотите передать результат в обратные вызовы, вам потребуется немного больше задействовать обработку, чтобы передавать аргументы в ваши обратные вызовы и потенциально обрабатывать случаи сбоя.

+0

Спасибо за это @nrabinowitz. Я не знал, как работают обещания, но это отличное объяснение. –

+0

Спасибо за это объяснение тоже @nrabinowitz, я не знал, как работают обещания – patricK

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