Новичок в веб-разработке и изучении Javascript.
Я следил за учебником по обещаниям, чтобы попытаться понять, для чего они используются и что в них такого полезного, и наткнулся на этот код:
var isMomHappy = true;
// Promise
var willIGetNewPhone = new Promise(
function (resolve, reject) {
if (isMomHappy) {
var phone = {
brand: 'Samsung',
color: 'black'
};
resolve(phone);
} else {
var reason = new Error('mom is not happy');
reject(reason);
}
}
);
//call our promise
var askMom = function () {
willIGetNewPhone
.then(function (fulfilled) {
// yay, you got a new phone
console.info(fulfilled);
})
.catch(function (error) {
// ops, mom don't buy it
console.info(error.message);
});
}
askMom();Зачем нужен метод .then () при вызове и обработке обещания?
Могу я не просто сделать следующее:
var isMomHappy = false;
// Promise
var willIGetNewPhone = new Promise(
function (resolve, reject) {
if (isMomHappy) {
var phone = {
brand: 'Samsung',
color: 'black'
};
resolve(phone);
console.info(phone);
} else {
var reason = new Error('mom is not happy');
reject(reason);
console.info(reason.message);
}
}
)
willIGetNewPhone;... как это, кажется, воспроизводит те же результаты?
Спасибо,
Стю
.then() позволяет объединять методы в цепочку
Поскольку обещание - это то, что должно произойти в будущем, then - это то, что произошло. Иначе как еще можно исправить то, что произойдет в будущем?
Ive been following a tutorial on Promises Что это за учебник? Как уже указывалось, пример бессмысленный, и я не удивлен, что вы упустили суть. Дело в том, что когда вы начинаете выполнять асинхронные операции, обещания делают жизнь намного проще и даже проще при использовании с async / await ..
Обещания действительно используются только для асинхронных операций или ситуаций, когда функция может или не может функционировать асинхронно, но потребитель функции ожидает обещания. Например, у вас может быть функция базы данных, использующая websql или indexDB с обещаниями, которая возвращается к localstorage. Localstorage - это синхронизация, поэтому ваша функция возврата будет иметь return Promise.resolve(value); в конце, чтобы ваша операция синхронизации велась для вызывающей стороны, как если бы она была асинхронной.



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


The then method returns a Promise which allows for method chaining.
If the function passed as handler to then returns a Promise, an equivalent Promise will be exposed to the subsequent then in the method chain.
См. Его на документы для более подробной информации.
Очень простым термином (разговорный язык):
Цепочка обещаний Why do you need to use .then(), безусловно, полезна для людей, но не для этого нам нужен then. Даже для одного обработанного обещания нужен then.
Ваш пример здесь просто не отражает реальной ситуации. Обещание полезно, когда, например, вы имеете дело с данными, которые необходимо загрузить в первую очередь.
Вот еще один пример (это все еще тарабарщина, а не 100% то, что вы делаете на самом деле)
const myPromise = new Promise((resolve) => {
setTimeout(
() => resolve('hello promise'),
1000
);
});
myPromise.then((data) => console.info(data));
console.info('This is called after then, yet it was executed before the promise resolved');Как видите, у вас нет данных, которые сразу разрешаются обещанием, но вам нужно подождать секунду. Представьте, вы пытаетесь получить данные с сервера. Он не будет доступен сразу. Поэтому вместо этого вам нужно подождать, пока он не будет решен.
В ES7 есть другой синтаксис, который может сделать его немного более понятным: async / await:
const myPromise = new Promise((resolve) => {
setTimeout(
() => resolve('hello promise'),
1000
);
});
const init = async() => {
const data = await myPromise; // wait until promise has resolved
console.info(data);
console.info('Now the code flow is "correct" in the readers view')
};
init();.then((result)=>{}) запрашивает значение обещаний для передачи в функцию.
Ваш пример обещания немного ужасен, поэтому вот более подходящий пример
const doingStuff=new Promise(function(resolve, reject){
setTimeout(function(){
resolve('hello world');
}, 10000);
});
doingStuff.then(function(result){
console.info(result);
});
console.info('after hello world');Обратный вызов в .then вызывается по истечении времени ожидания. Это асинхронно. Это также означает, что ваша функция в тайм-ауте больше не является анонимной, и если она ошибается, промисы четко покажут, что обещание doStuff ошибочно.
Если вы запустите это, ваша консоль скажет
after hello world
hello world
В обратном направлении, это потому, что ваш then запустился через 10 секунд, даже если он появился первым в коде.
Если вы попробуете этот код, ошибка произойдет до разрешения.
const doingStuff=new Promise(function(resolve, reject){
setTimeout(function(){
resolve('hello world');
}, 10000);
setTimeout(function(){
reject(new Error('Something went wrong'));
},5000);
});
doingStuff.then(function(result){
console.info(result);
});
console.info('after hello world');В журнале консоли будет указано точное место, где произошла ошибка. И даже лучше, вы можете обработать ошибку позже, обещание будет удерживать ошибку до тех пор, пока вы не будете готовы использовать .catch(function(e){});.
const doingStuff=new Promise(function(resolve, reject){
setTimeout(function(){
resolve('hello world');
}, 10000);
setTimeout(function(){
reject(new Error('Something went wrong'));
},5000);
});
doingStuff.then(function(result){
console.info(result);
}).catch(function(e){
console.info('Error message:', e.message);
});
console.info('after hello world');Это хорошо объясняет. Таким образом, в основном задержка означает, что действия, которые необходимо выполнить, должны быть связаны с помощью .then. Иначе, если бы они были помещены в само обещание, они не стали бы ждать ответа? Таким образом, пример, которому я следовал, совсем этого не демонстрирует!
Ага, это правильно. Также вы можете повторно вызвать .then с тем же обещанием и получить результат во второй раз без повторного запуска функции, которая его сгенерировала. В моем собственном коде я использовал эту функцию здесь. stackoverflow.com/questions/51563091/… Также попробуйте намеренно выдать ошибку в своем обещании и сравните с традиционной цепочкой обратных вызовов. Цепочка обещаний дает очень четкую трассировку стека, что делает их очень полезными для больших приложений.
Заявление
willGetNewPhone;ничего не делает.