2014-11-02 2 views
3

Эй, ребята, я пытаюсь остановить цепочку обещаний на полпути (после улова). Поэтому после того, как в первом обещании произошла ошибка, поймать ее поймает, но я не хочу, чтобы цепочка продолжалась. Я использую синюю птицу. Как мне это сделать?Остановить цепочку обещаний посредине

getRedirectedURL(url).then(function(url) { 
       console.log(1); 
       url = domainCleanse(url); 
       sql = mysql.format(select, url); 

       return [ url, mysqlQuery(sql) ]; 

      }).catch(function(error) { 
       console.log(2); 
       console.error(error); 
       socket.emit('error:unreachable', url + ' was unreachable'); 
      }).spread(function(url, rows) { 
       console.log(3); 
       if(_.isEmpty(rows[0])) { 
        socketList.push({ 
         url: url, 
         ttl: _.now(), 
         socket: socket, 
         added: false 
        }); 
       } else { 
        socket.emit('done', mapResults(rows[0])); 
       } 
      }).catch(function(error) { 
       console.log(4); 
       console.error(error); 
       socket.emit('error', 'We could not reach ' + url + ' at this time.'); 
      }); 
+0

Возможный дубликат [Обработка множественных уловов в цепочке обещаний] (http://stackoverflow.com/questions/26076511/handling-multiple-catches-in-promise-chain) – Bergi

+0

возможно также см. [Перерыв в цепочке обещаний и вызов функция, основанная на шаге в цепочке, где она сломана] (http://stackoverflow.com/q/20714460/1048572) – Bergi

ответ

1

Обобщая ваш пример, это выглядит следующим образом:

promiseToFoo() 
    .then(promiseToBar) 
    .catch(failedToFooOrBar) 
    .then(promiseToFrob) 
    .catch(failedToFrob) 

По счастливому пути вы пообещав Foo, затем Bar, затем Frob. На основе вашего описания вы хотите обрабатывать ошибки Fooing или Barring отдельно от ошибок Frobbing. Таким образом, простое решение - похоронить обработку ошибок для Frob в этом обещании. Поэтому вместо того, чтобы связывать обещание с Frob, вы связываете обещание Frob и обрабатывать ошибки в Frobbing. Что-то вроде этого:

promiseToFoo() 
    .then(promiseToBar) 
    .catch(function (error) { 
     failedToFooOrBar(error); 
     return Promise.reject(error); 
    }) 
    .then(function (x) { 
     return promiseToFrob(x).catch(failedToFrob); 
    }); 

Ключа к этому, чтобы убедиться, что ваш на режекторном обработчик в первом catch заканчивается оставив цепочку в отклоненном состоянии, когда он уходит. Это обрабатывается в примере выше, возвращая отклоненное обещание от обработчика. Вы также можете справиться с этим, выбросив ошибку из обработчика. Если вы не выполните одно из этих действий, то обещание будет выполнено в состоянии, когда обработчик закончит работу, и обработчик on-выполнения, предоставленный последующим вызовом then, будет вызван.

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