Современный новичок в JS / Promise здесь. Мне трудно найти ответ на простой вопрос, несмотря на огромное количество материалов по этой теме.
Я считаю, что хорошо разбираюсь в JS Promises (благодаря различным источникам, включая mdn и https://spin.atomicobject.com/2016/02/16/how-javascript-promises-work/)
Я регулярно потреблял и создавал обещания в их простейшей форме, однако продолжаю натыкаться на методы в моих унаследованных проектах со следующим шаблоном:
const doAsyncOp = () =>
$http.get(uri)
.then(
value => value,
reject => //...
);
У меня большой вопрос: что произойдет, если вы просто вернете значение из обработчика успеха? Мне нужно использовать этот метод и получить доступ к «значению» в клиентском коде. Это технически необработанное? Стоит ли переписывать реализацию?
Прошу прощения, если фрагмент не понятен. Отказ здесь произвольный; Мне нужен доступ к значению в клиентском коде. Возможно ли это с помощью этого кода?
Если под «клиентом» вы имеете в виду вызывающего абонента, вы возвращаете обещание из своей функции, поэтому вы можете просто использовать doAsyncOp().then(value => /* do whatever you need */).
Клиентский код, то есть область действия сценария потребителя. Вызывающий является частью клиентского кода. И, да, но что, если реализация уже включает .then (value => value)? Я бы хотел использовать этот метод, не изменяя его, потому что этот тип реализации метода многократно повторяется в проекте. Думаю, кто-то мне это разъяснил. Спасибо хоть!
Берги, я понял, что вы ответили на мой вопрос; Мне просто нужно было доработать. jfriend00 помог мне это прояснить. Ваше здоровье!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы передать это в клиентский код, просто верните обещать из вашей функции:
const doAsyncOp = () => $http.get(uri)
то в своем клиенте вы можете использовать:
doAsyncOp()
.then(value => {
// use value
}
.catch(err => { /* error */ }
My big question is: What happens when you simply return a value from your success handler?
Когда вы возвращаете значение из обработчика .then(), это значение становится разрешенным значением родительской цепочки обещаний: Итак, в этом коде:
// utility function that returns a promise that resolves after a delay
function delay(t, v) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, v), t);
});
}
function test() {
return delay(100, 5).then(val => {
// this return value becomes the resolved value of the promise chain
// that is returned from this function
return 10;
});
}
test().then(result => {
// logs 10
console.info(result);
});Когда вы запустите его, он будет записывать 10 из-за return 10 в обработчике .then().
У обработчика .then() есть четыре возможности:
Вернуть обычное значение, такой как return 10 или return val. Это значение становится разрешенным значением цепочки обещаний. Если значение не возвращается (что в Javascript означает, что возвращаемое значение - undefined), то разрешенное значение цепочки обещаний - undefined.
Верните обещание, которое в конечном итоге выполняется или уже выполнено. Это обещание добавляется в цепочку, и цепочка обещаний принимает разрешенное значение этого обещания.
Верните обещание, которое в конечном итоге отклоняется или уже отклонено. Это обещание добавляется в цепочку, и цепочка обещаний принимает на себя отклоненную причину возвращенного обещания.
Выбросить исключение. Если в обработчике .then() возникает исключение, инфраструктура .then() перехватит его и переведет цепочку обещаний в состояние отклонения, при этом для причины отклонения установлено значение, которое генерируется. Итак, если вы выполняете throw new Error("User not found") внутри обработчика .then(), тогда эта цепочка обещаний будет отклонена с этим объектом ошибки в качестве причины отклонения.
В вашем конкретном коде:
const doAsyncOp = () =>
$http.get(uri)
.then(
value => value,
reject => //...
);
Нет причин для value => value. value уже является разрешенным значением обещания, вам не нужно устанавливать его снова.
А поскольку функция жирной стрелки автоматически возвращает любой отдельный оператор, вы уже возвращаете обещание от $http.get().then() в своей функции doAsyncOp(). Итак, вы можете просто сделать:
const doAsyncOp = () => $http.get(uri);
doAsyncOp().then(result => {
// handle the result here
}).catch(err => {
// handle error here
});
Ваше здоровье!! Теперь это имеет смысл.
Я думаю, вы можете использовать async и ждать разрешенных значений.
function delay(t, v) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, v), t);
});
}
async function(){
await myData = delay(1000, 1000);
console.info(myData);
}
.then(value => value). Вы можете просто передатьnullили использоватьcatch, если хотите обрабатывать только отклонения.