Почему обещание, возвращаемое функцией, преобразуется в значение, возвращенное из .then внутри этой функции - PullRequest
0 голосов
/ 08 апреля 2019

Я создал функцию, которая возвращает обещание.

function fetch1 () {
 return new Promise((res, rej) => {
  res("A");
 });
}

Я вызываю эту функцию внутри функции api1 и возвращаю обещание, возвращаемое из fetch1.

function api1 () {
 return fetch1().then(v =>{
  console.log("Api1", v);
  return "B"
 );
}

Как видите, я возвращаю то же значение, которое возвращается из fetch1. Я не создаю никаких новых Обещаний. Но когда я вызываю это, я получаю следующий вывод.

api1().then(v => console.log("Api2 call", v));

Api1 A
Api2 call B

Мой ожидаемый результат должен быть

Api1 A
Api2 call A

Как видно из этой ссылки . Это обещание тогда приковано цепью. Обещание, возвращенное сначала, затем разрешается следующим. Но я не возвращаю никаких обещаний внутри функции api1.

Я могу обойти это. Но почему это происходит.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2019

Когда вы возвращаете Обещание, вы на самом деле не возвращаете то, что внутри Обещания, а само Обещание.Когда вы говорите

function api1 () {
 return fetch1().then(v =>{
  console.log("Api1", v);
  return "B"
 );
}

, вы говорите "console.log результат предыдущего обещания", тогда возвращаете новое обещание, содержащее B.

когда вы звоните

api1().then(v => console.log("Api2 call", v));

, исходное обещание (содержащее "A") уже было использовано, а ваше новое обещание содержит строку "B", которую вы вернули ранее.

Чтобы получить вывод, который вынамеревайтесь переписать свой второй раздел так:

function api1 () {
 return fetch1().then(v =>{
  console.log("Api1", v);
  return v;
 );
}
0 голосов
/ 08 апреля 2019
 function fetch1 () {
 return new Promise((res, rej) => {
  res("A");
 });
}

function api1 () {
 return fetch1().then(v =>{
  console.log("Api1", v);
  return "B"
 });
}

api1().then(v => console.log("Api2 call", v));

При вызове api1().then(v => console.log("Api2 call", v));, api1() будет ожидать разрешенного обещания в fetch1 для разрешения, что означает, что функция v in then in api1 будет равна 'A', тогдафункция then вернет «B» следующему, то есть then в then(v => console.log("Api2 call", v));, значение v будет равно «B».Я надеюсь, вы понимаете!

0 голосов
/ 08 апреля 2019

Как видите, я возвращаю то же значение, которое возвращается из fetch1

Это на самом деле не совсем верно, вы звоните then после fetch1. Это имеет значение.

С синхронным кодом без обещаний это почти то же самое. Если вы вернетесь в методе:

return sum(3,7).multiply(2);

Вы не просто возвращаете sum(3,7), потому что после этого вы звоните multiply(2). Это вернет число 20 из-за вызова multiply.

С обещаниями все почти так же, как:

const myResultPromise = return sumPromise(3,7).then(sumValue => {
  return multiplyPromise(2);
})

Здесь myResultPromise будет обещанием 20, потому что then присоединяет новое обещание к исходному sumPromise.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...