Тогда JavaScript без обещания возврата val - PullRequest
0 голосов
/ 12 октября 2018

Возможно, я не в Google правильно.тогда функция без параметра не блокирует?например, у вас есть обещание:

someFunc = () => {
  return new Promise((res,rej)=>{
   somethingAsync(input).then((val) => res(val))
  })
}

в следующих реализациях нашей функции.оба будут ждать возвращения someFunc val?

someFunc().then(dosomethingafter())
someFunc().then((val) => dosomethingafter())

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

В выражениях JS оцениваются с нетерпением.Это означает, что каждый аргумент функции оценивается перед тем, как передан.

someFunc().then(dosomethingafter())

фактически идентичен

var tmp = dosomethingafter();
someFunc().then(tmp)

, поэтому функция someFunc().then(dosomethingafter()) вызывается до then вызывается, и его возвращенный результат передается в качестве параметра.

Что вы, вероятно, имели в виду вместо этого:

someFunc().then(dosomethingafter)

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

0 голосов
/ 12 октября 2018

Это проще проиллюстрировать на примерах.Ваш первый случай:

const fn = (text) => {console.log(text)}

const waiter = () => new Promise((resolve, reject) => {
  return setTimeout(() => {
    fn('resolved')
    resolve()
  }, 2000)
})

waiter().then(fn('done'))

Обратите внимание, что fn сначала выполняется, оценивается, а затем выполняется waiter.

Давайте рассмотрим 2-й случай:

const fn = (text) => {console.log(text)}

const waiter = () => new Promise((resolve, reject) => {
  return setTimeout(() => {
    fn('resolved')
    resolve()
  }, 2000)
})

waiter().then(() => fn('done'))

Обратите внимание, что теперь мы получили resolved, а затем done.

Итак, ответ на ваш вопрос: да, в обоих случаях мы будем ждать и выполнять someFunc или в приведенном выше примере waiter.

ОсновнойРазница действительно в том, когда ваш dosomethingafter исполняется.

В первом случае это сразу, а затем оно передается в waiter.

Во втором случае у вас есть действующая цепочка обещаний, которая сначала будет выполнена, а затем однажды выполнена (а поскольку fn действует как обработчик функции then), она выполнит dosomethingafter.

0 голосов
/ 12 октября 2018

Pass doSomethingafter первого класса

const handleAsJson = response => response.json()
fetch(url)
  .then(handleAsJson)
  .then(console.log)
...