Я пытаюсь узнать о обещаниях JavaScript, и до сих пор я сталкивался с большим количеством кода, в котором возвращается либо голая (из-за отсутствия лучшего слова) Promise, то есть одна без вызова .then()
и кода где .then()
прилагается.
В чем разница между ними и когда вы используете один над другим?
myfn1() {
return new Promise((resolve, reject) => {
//...resolve or reject
}
}
.then()
прилагаетсяmyfn2() {
return new Promise((resolve, reject) => {
//...resolve or reject
}
.then((res) => {
//...do something upon resolve
})
}
Когда вы используете, then
вы определить, где вы хотели бы обрабатывать данные (или ошибку) решенные обещанием. Если цепь его then
сразу, то я предполагаю, что это нормально для вас, чтобы немедленно ее решения.
Но вы можете просто получить обещание и позаботиться о результатах где-нибудь еще. Возможно, у вас есть служебный файл, единственной целью которого является создание HTTP-запросов, но вы хотите обрабатывать данные под другой областью - область вызывающей функции:
// service.js
callServer() {
return new Promise(...)
}
// file.js
callServer().then( /* there a different scope here */ )
Возможно, вы даже хотите получить несколько обещаний, а затем использовать Promise.all(promisesArray)
и действовать только после того, как все обещания были решены:
const movies = getMovies(); // promise
const actors = getActors(); // promise
const directors = getDirectors(); // promise
Promise([movies, actors, directors]).then(_ => /* handle data */ );
В зависимости от приложения может быть много причин.
Основное различие заключается в том, что вы сможете использовать результат операции (обычно async), определенный из предыдущей цепочки обещаний. Рассмотрим следующий код:
new Promise((resolve, reject) => {
// we simulate an async op using setTimeout that returns an object
setTimeout(() => resolve({ status: 'ok' }), 2300);
// the value of res is defined as the value that is resolved from the previous promise chain, so in this case the object { status: 'ok'}
}).then(res => {
// do something with resolved result
console.log(res)
})
Без метода then
вы не сможете получить значение возвращаемого значения, определенное в предыдущей цепочке обещаний.
Низкий уровень и основное различие между ними состоит в том, что возвращается другое обещание.
return new Promise((resolve, reject) => {
//...resolve or reject
}
возвращает обещание, созданное призывом к new Promise
.
return new Promise((resolve, reject) => {
//...resolve or reject
}
.then((res) => {
//...do something upon ** fulfillment **
})
возвращает обещание, возвращенное вызовом методу then
нового обещания.
Если обещание, на которое then
вызывается (созданное new Promise
выше), будет отклонено, обещание, возвращенное к тому then
с помощью одного параметра, отклоняется по той же причине: then
поставленный на обработчик обработанной реакции никогда не вызывается.
Если первое обещание выполнено, то обратный вызов, переданный в качестве первого параметра, then
вызывается, и обещание, возвращаемое then
устанавливается в соответствии с поведением обратного вызова:
Если обратный вызов возвращает значение, которое не является обещанием, обещание, возвращаемое then
выполняются с тем же значением, или
Если обратный вызов вызывает ошибку, обещание, возвращаемое then
, отклоняется со значением ошибки,
Если обратный вызов возвращает обещание (либо своеобразное обещание, либо одно из кода библиотеки), то обещание, возвращенное с этого then
, связано с ним и в конечном итоге будет принимать то же урегулированное состояние, а также оправданное значение или отклонение в качестве обещания, возвращаемого обратным вызовом.
Решив вернуть обещание, созданное new Promise
, или один, возвращенные последним, then
или catch
положение в цепочке обещаний, от функции зависит от конструкции функции, а не дизайн объектов Promise.