2016-05-31 4 views
0

Рассмотрим этот кодQ обещание цепочки, обработчик ошибок не называется

var tryWithoutReindexing = function(indexName, properties) { 
     var settings = properties["settings"]; 
     var mappings = properties["mappings"]; 
     return elastic.closeIndex(indexName) 
      .then(elastic.putSettings(indexName, settings)) 
      .then(elastic.putMapping(indexName, mappings)) 
      .then(elastic.openIndex(indexName)); 
}; 

И позвони:

tryWithoutReindexing(indexName, newProperties) 
.then(function success(value){ 
     console.log('migration successful'); 
    }, function error(){ 
     console.log('migration unsuccessful'); 
    }); 

Метод elastic.putSettings бросает ошибку, но по какой-то причине, console журналы 'migration is successful'. Я бы ожидал вызова обработчика ошибок.

Если изменить способ это:

var tryWithoutReindexing = function(indexName, properties) { 
     var settings = properties["settings"]; 
     var mappings = properties["mappings"]; 
     return elastic.closeIndex(indexName) 
      .then(elastic.putSettings(indexName, settings)) 
       .then(function success() { 
       console.log('err'); 
      }, function(error) { 
       console.log(error); 
      }) 
      .then(elastic.putMapping(indexName, mappings)) 
      .then(elastic.openIndex(indexName)); 
}; 

, и поставить точку останова в строке console.log(error);, обработчик ошибок называется, так что кажется, что метод putSettings работает правильно.

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

+0

Не похоже, чтобы вы показывали нам свой фактический код. У вашей альтернативной версии метода есть строки, которые присваивают 'settings' и' mappings', в то время как ваша первая версия не имеет этого, но все еще использует эти переменные. Пожалуйста, приложите свой код к чему-то, что действительно порождает проблему, но вы можете копировать здесь без изменений. Нам нужно увидеть фактический код, потому что дьявол находится в деталях. – JLRishe

+0

@JLRishe updated, это была единственная разница, которую я опустил для краткости – Raston

ответ

2

Я предполагаю, что elastic.putSettings() и другие возвращают обещание. Вы не можете использовать обещание в качестве аргумента для .then; этот метод ожидает функция аргументы. В свою очередь, эти функции могут вернуть обещание.

Итак, вам нужно обернуть свои функции, возвращающие обещания, анонимной функцией и использовать эту функцию в качестве аргумента для .then. Вроде так:

var tryWithoutReindexing = function(indexName, properties) { 
    var settings = properties["settings"]; 
    var mappings = properties["mappings"]; 

    return elastic.closeIndex(indexName) 
       .then(function() { 
        return elastic.putSettings(indexName, settings); 
       }) 
       .then(function() { 
        return elastic.putMapping(indexName, mappings); 
       }) 
       .then(function() { 
        return elastic.openIndex(indexName); 
       }); 
}; 
+0

ok, ответ правильный, но мне нужно уточнение. elastic.putSettings (IndexName, настройка) является функцией, которая возвращает обертку обещание: putSettings: функция (IndexName, настройка) { возврата client.indices.putSettings ({ индекса: IndexName, тела: настройки }); }, Так почему именно это не сработало? Это аргумент функции, а не обещание (я думаю) – Raston

+0

Я понимаю, я думаю. То, что я сделал, - это вызов функции с аргументами, что приводит к обещанию. Есть ли способ передать ссылку на функцию с аргументами для привязки? Жирные стрелки и обертка функций - это опции, но я ищу один лайнер для более чистого кода. – Raston

+1

@Raston попробуйте это: '.then (elastic.putSettings.bind (elastic, indexName, settings))' (он делает код более краткая, но не обязательно чистая ИМО) – robertklep