Как цепочки обещаний могут утверждать, что какое значение из какого возвращаемого значения? - PullRequest
0 голосов
/ 12 марта 2019

Я сейчас изучаю Электрон в действии. Я учу JavaScript на ходу, но в Google это не дошло, поэтому я решил спросить об этом здесь. Представьте, что у нас есть этот код:

newLinkForm.addEventListener('submit', (event) => {
  event.preventDefault();
  const url = newLinkUrl.value;
  fetch(url)
    .then(response => response.text())
    .then(parseResponse)
    .then(findTitle)
    .then(title => storeLink(title, url))
    .then(clearForm);
});

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

then(returnvalue1=>funct1, returnvalue2=>funct2)

Можем ли мы сделать это? Спасибо за ответ.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Обещание имеет только одно разрешенное значение, поэтому обработчику .then() всегда передается только один аргумент.

Если вы хотите разрешить обещание с несколькими значениями, тогда вы обычно заключаете их в массив или объект, и единственным разрешенным значением будет массив или объект.

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

Пример:

Promise.resolve([1,2]).then(result => {
    console.log(result);     // logs [1,2]
    return result;           // pass the array on to the next step
}).then(([a, b]) => {          // use destructuring to get the two items out of the array
   console.log(a); 
   console.log(b);
});

То, что вы предложили так:

.then(returnvalue1=>funct1, returnvalue2=>funct2)

это нечто совершенно другое. Здесь вы передаете две функции .then(), как в .then(f1, f2) (или это похоже на то, что вы пытаетесь сделать). Когда вы передаете вторую функцию в .then(), эта вторая функция является обработчиком отклонения (например, обработчик .catch()), и она вызывается только в том случае, если обещание отклоняется, а аргумент будет причиной отклонения.

0 голосов
/ 12 марта 2019

Второй then аргумент зарезервирован для обработчика ошибок, then(returnvalue1=>funct1, returnvalue2=>funct2) - неправильный способ обработки возвращаемых значений.

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

В случае, когда значения из различных then должны использоваться вместе, они должны быть либо переданы через всю цепочку обещаний в виде массива или значения объекта, и деструктурированы:

promise
.then(foo => {
   const bar = 'bar';
   return [foo, bar];
 })
.then(([foo, bar]) => {
  // can access both foo and bar
})

Или then должен быть вложенным, чтобы иметь доступ к области, где доступно необходимое значение:

promise
.then(foo => {
   const bar = 'bar';

   return Promise.resolve(bar);
   .then(bar => {
     // can access both foo and bar
   })
 })

Это одна из проблем, которые решает async..await.

...