【问题标题】:Why can I not call resolve() for Promises in SetTimeout Function directly为什么我不能直接在 SetTimeout 函数中为 Promises 调用 resolve()
【发布时间】:2020-06-09 12:27:27
【问题描述】:

我有两个版本的睡眠功能,一个正在等待解决另一个不是:

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 可以将函数的调用延迟给定的时间。 resolve() 不是函数吗? 我发现了这篇文章JavaScript promise resolving with setTimeout,这正是我在这里要问的,除了我正在使用异步等待。我也没有得到解释。有人可以向我解释为什么会这样吗?

【问题讨论】:

  • setTimeout(resolve('done'), ms);resolve('done')被执行,然后它的返回值作为setTimeout的第一个参数
  • 另外,如果您只需要一个sleep 函数并且您并不真正关心它返回的内容,您可以执行new Promise((resolve) => setTimeout(resolve, 3000)),这将在一定数量之后调用resolve 函数秒,而不是像现在这样立即调用它。
  • "Resolve() 不是函数吗?" - 不,表达式 resolve() 的结果不是函数。 resolve 本身就是。
  • 这正是我不确定的。我认为我作为 SetTimeout 函数的第一个参数给出的内容将在给定的毫秒后执行。但参数首先被评估,结果将在给定的毫秒后“执行”。谢谢

标签: javascript node.js async-await settimeout resolve


【解决方案1】:
setTimeout(() => resolve('done'), ms);

这意味着“使用文本 () => resolve('done') 创建一个函数并将其传递给 setTimeout”。 setTimeout 将等待指定的时间,然后调用该函数。

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

这意味着“立即调用resolve('done') 并将其结果传递给settimeout”。 resolve 的返回值是undefined,所以 undefined 被传递给 setTimeout。因此 setTimeout 没有函数在 3 秒后运行。

【讨论】:

  • 谢谢,这真的让我明白了。所以 SetTimeout 函数的第一个参数是“执行”的,结果会在给定的时间后被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
相关资源
最近更新 更多