GOOGLE ADS

вторник, 10 мая 2022 г.

Как разрешить или отклонить обещание из результата другого обещания?

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

Возьмите это в качестве примера:

const fetchData = (email, password) => new Promise(async (resolve, reject) => {
await axios.post('https://api.something.com', {
email: email,
password: password,
},
{
headers: {
'Content-Type': 'application/json',
}
})
.then(res => {
cookie = res.headers['set-cookie'];
})
.catch(err => {
return reject('Login failed');
});
await axios.get('https://api.something.com', {
headers: {
'cookie': cookie
}
})
.then(res => {
data = res;
})
.catch(err => {
return reject('Failed to retrieve something');
});
return resolve(data);
});

Если учетные данные для входа неверны, будет отправлено сообщение об ошибке «Ошибка входа», но сценарий будет продолжать работать, и появится дополнительное сообщение об ошибке, в котором говорится, что файл cookie не установлен. Я хочу полностью остановить скрипт в первом улове.

Я мог бы использовать throw new Error('Login failed'), и это полностью остановило бы сценарий, но я не чувствую, что это правильный ответ, а также потому, что это заставляет меня задаться вопросом, что еще я мог бы использовать для выполнения обещания (для других целей) и по-прежнему не позволяйте сценарию продолжайте бежать.

Меня также не интересуют вложенные функции, чтобы избежать ада, похожего на рождественскую елку с обещанием обратного вызова.

Я имею смысл?


Решение проблемы

Поскольку вы используете async/await, вам не нужно создавать новое обещание, а вместо then/catch использовать await и try/catch;

const fetchData = async (email, password) => {
let cookie;
try {
const res = await axios.post(
"https://api.something.com",
{
email,
password
},
{
headers: {
"Content-Type": "application/json",
},
}
);
cookie = res.headers["set-cookie"];
} catch (err) {
throw new Error("Login failed");
}
let data;
try {
const res = await axios.get("https://api.something.com", {
headers: {
cookie
},
});
data = res;
} catch (err) {
throw new Error("Failed to retrieve something");
}
return data;
};

Если вы хотите использовать Promise API вместо async/await, вы можете изменить промисы: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#chaining

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...