Я думаю, что путаница, возникающая из-за того, что на основе использования вами 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)
ли ваш код работать правильно как есть, и вы просто ищете * лучше * решение? – apsillers
Откуда берутся 'res' и' rej'? Это очень похоже на конструктор '' Promise' (http://stackoverflow.com/q/23803743/1048572) – Bergi
Это также немного похоже на http://petkaantonov.github.io/bluebird/web/ Docs/анти-patterns.html #-.then –