2013-03-04 5 views
3

У меня есть массив объектов, таких как шахматная доска, каждая из которых имеет top, down, left, right Функция, которая возвращает объект соседа.JS - остановка цепочки объектов без ошибок

data.field(3,3).left() //returns field(2,3); 

Я могу приковать его как

data.field(3,3).left().left().top().right().down().getName();

Но нет ни одного объекта с отрицательными шнурами, как

data.field(-1,0)

Его легко обнаружить, когда данные корды отрицательны или больше чем массив объектов. Вы можете вернуть ложный или пустой объект - но когда нет ничего возвращается и сцепление продолжается есть ошибка

Uncaught TypeError: Object #<error> has no method 'down' 

Что OFC вещь, но как я могу избежать этой ошибки, и остановить длинную цепь, когда есть нет объекта для возврата без получения ошибки, которая останавливает выполнение js?

Позволяет сказать:

data.left().left()/*here there is nothing to return*/.right().right().getName(); //should return false 
+0

Вы хотите, чтобы цепь просто пропустила недействительные вызовы и продолжила цепочку, как будто ничего не произошло? – jbabey

+0

Итак, что бы вы хотели, чтобы вся строка вернулась в конце? Не могли бы вы вернуть «поддельный» объект, который имеет методы, но не данные? –

+1

позволяет сказать, что у меня есть 100 цепочек предметов, которые возвращают false на 10-м шаге. Я хочу, чтобы вся цепочка возвращала false (и по соображениям производительности, что было бы неплохо прекратить выполнение 90 элементов после ложных значений) – OPOPO

ответ

2

Вместо возвращение нуля на неправильное место, вернуть обычай «нулевой объект», который перекрывает направления функции просто возвращает нулевой объект с функцией GetName, которая возвращает «недопустимое расположение "или генерирует исключение, когда вызываются эти функции.

nullObject = { 

    this.left = function(){return this;} 
    this.right = function(){return this;} 
    //etc 
    this.getName = function(){"Invalid Location"} 

} 

Обработка исключений может выглядеть следующим образом

try{ 
    piece.left().right().down().getName() 
} 
catch(exc){ 
    //handle exception 
} 

Кстати, вы, по сути создавая монады здесь. Если вы остановите вычисление при получении нулевого объекта, то это пример maybe monad. Тем не менее, здесь есть несколько теоретических уровней выше практической проблемы.

+0

нет возможности проверить что-либо, когда вызываемая функция не exsist – OPOPO

+0

oh sorry true. поэтому не возвращайте null, возвратите специальный тип объекта, который является недопустимым объектом, с которым вы можете проверить. –

0

try/catch Структура позволяет остановить выполнение в случае, если ничего не возвращается. Однако, если вы не хотите использовать try/catch, каждый метод должен иметь возможность возвращать объект, которому принадлежат те же методы, которые возвращают сам объект. В этом случае цепь будет полностью выполнена:

right: function() { 
    var nextItem; 
    // get next item to the right here 
    return nextItem || { 
     up: function() { return this; }, 
     right: function() { return this; }, 
     down: function() { return this; }, 
     left: function() { return this; } 
    }; 
} 
Смежные вопросы