В чем разница между возвратом Обещания с .then () и без .then ()?

1

Я пытаюсь узнать о обещаниях 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
    })
}
Теги:
asynchronous
promise

3 ответа

3
Лучший ответ

Когда вы используете, 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 */ );

В зависимости от приложения может быть много причин.

  • 0
    Привет, Омри, в этом много смысла. Если не слишком много хлопот, не могли бы вы немного прояснить ситуацию или привести небольшой пример обработки данных в другом объеме и возможных преимуществах?
  • 0
    На самом деле, не обязательно, если у вас есть функциональность, которая доступна только в одной области, то вам, возможно, придется обрабатывать ваши данные в этой области. имеет смысл.
2

Основное различие заключается в том, что вы сможете использовать результат операции (обычно 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 вы не сможете получить значение возвращаемого значения, определенное в предыдущей цепочке обещаний.

1

Низкий уровень и основное различие между ними состоит в том, что возвращается другое обещание.

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню