2015-05-11 2 views
2

Есть ли у кого-нибудь какие-либо мысли о обещаниях ES6, я использую их в приложении Node, и я люблю их, по большей части. Но Ive обнаружил, что если я получаю какую-то ошибку в обратном вызове решения, он не будет выкидывать ошибку или выполнять обратный вызов отклонения, и это оставляет меня с моим сервером, висящим бесконечно.Ловля ошибок в ES6 обещания

На данный момент я прибегал к этому и вручную отклонил обещание с пойманной ошибкой, но я не уверен, что это отличный способ справиться и/или если я вообще буду использовать обещания.

this.dataStore.set(newID, value).then((foo) => { 
    try{ 
     this.var = foo; 
     res({val: foo}); 
    }catch(e){ 
     rej(e); 
    } 
}, (e) => { 
    rej(e); 
}); 
+0

ли ваш код работать правильно как есть, и вы просто ищете * лучше * решение? – apsillers

+1

Откуда берутся 'res' и' rej'? Это очень похоже на конструктор '' Promise' (http://stackoverflow.com/q/23803743/1048572) – Bergi

+0

Это также немного похоже на http://petkaantonov.github.io/bluebird/web/ Docs/анти-patterns.html #-.then –

ответ

4

Я думаю, что путаница, возникающая из-за того, что на основе использования вами res и rej здесь, вы, вероятно, называют это внутри конструктора обещание, вдоль линий

function setStore(newID, value) { 
    return new Promise(function(res, rej) { 
     this.dataStore.set(newID, value).then((foo) => { 
      try{ 
       this.var = foo; 
       res({val: foo}); 
      }catch(e){ 
       rej(e); 
      } 
     }, (e) => { 
      rej(e); 
     }); 
    }); 
} 

Кстати, часть (e) => { rej(e); } в конце может быть переписана как e => rej(e), которая, в свою очередь, может быть переписана как rej.

Но в любом случае, вам не нужно ничего из этого окружающего оборудования для создания и вернуть собственное обещание, потому что this.dataStore.set и/или последующий вызов thenуже создает обещание, которое вы можете вернуться, как есть. Вместо того, чтобы создавать свои собственные новые обещания, а затем разрешать свои новые обещания с небольшим хешем на основе результата, полученного до then, возвращает хэш - это станет значением полученного обещания. Вместо отказа от вашего нового обещания, когда вызов dataStore.set терпит неудачу, просто позвольте неудачному обещанию быть самим собой.

Таким образом, вы не должны делать что-нибудь более сложное, чем

function setStore(newID, value) { 
    return this.dataStore.set(newID, value).then(foo => { 
     this.var = foo; 
     return {val: foo}; 
    }); 
} 

ошибка происходит в this.var = foo; return {val: foo}; части (но как же это?) Будет автоматически бросить обещание в состояние отказа. Ошибка, вызванная this.dataStore.set, приведет к неудачному обещанию как есть, и нет необходимости его поймать и реконструировать - неудача будет прогрессивно прогрессировать по цепочке.

Используйте это как:

setStore('abc', 123) . 
    then(hash => console.log(hash.val)) . 
    catch(e => console.log("The sky is falling", e)); 

как вопрос разъяснений, в следующем:

promise . then(success, failure) 

об ошибке, возникающей в success обратного вызова не обрабатываются в failure обратного вызова. Сбой в обратном вызове success будет выполняться на последовательных этапах цепи. Вы можете обрабатывать отказ в success (или сам promise) с

promise .then(success) . catch(failure) 
Смежные вопросы