Почему я не могу напрямую вызывать resol () для Promises в функции SetTimeout - PullRequest
1 голос
/ 25 февраля 2020

У меня есть две версии функции сна, одна ожидает разрешения, другая - нет:

function sleephelper1(ms) {
    return new Promise(function(resolve) {
        setTimeout(() => resolve('done'), ms);
    })
  }

  function sleephelper2(ms) {
    return new Promise(function(resolve) {
        setTimeout(resolve('done'), ms);           
    })
  }

Затем я вызываю sleephelper1 или sleephelper2:

async function test(){
var test = await sleephelper1(3000);
console.log(test)
console.log("exit test function")
  }

test()

Первый ждет 3 секунды, прежде чем решит. Но sleephelper2 не работает должным образом. Код выполняется немедленно. Я думал, что SetTimeout может задержать вызов функции на определенный промежуток времени. Разрешение () не является функцией? Я обнаружил, что этот пост JavaScript обещание разрешается с помощью setTimeout , и это именно то, о чем я здесь прошу, за исключением того, что я использую asyn c await. Также я не получил объяснения. Может ли кто-нибудь объяснить мне, почему это ведет себя так, как это происходит?

1 Ответ

5 голосов
/ 25 февраля 2020
setTimeout(() => resolve('done'), ms);

Это означает «создать функцию с текстом () => resolve('done') и передать ее в setTimeout». setTimeout будет ожидать указанное количество времени, а затем вызовет эту функцию.

setTimeout(resolve('done'), ms);

Это означает «немедленно вызвать resolve('done') и передать его результат в settimeout». возвращаемое значение из разрешения равно undefined, поэтому неопределенное передается в setTimeout. Таким образом, функция setTimeout не запускается через 3 секунды.

...