想要对闭包,作用域和异步进行一些澄清

时间:2018-10-03 01:25:49

标签: javascript

我基本上将此代码复制粘贴为异步,某些功能会超时,但是我很难理解它。

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds))
}
/*
  Some stuff
*/
sleep(10000).then(()=>{/*Do something*/});

因此,在上面我声明了一个标记为 sleep 的常量变量,该变量被分配了一个函数表达式,该函数表达式接受一个标记为 milliseconds 的参数。

该函数表达式继续调用函数 Promise ,该函数将异步执行标有 resolve 的函数表达式。

现在这部分让我感到困惑。 解析 函数表达式调用 setTimeout ,其等待时间为 毫秒 > ms,然后调用 解决 。我的理解是上面的 resolve 和嵌套的是两个不同的函数,而嵌套的只是一个名为 resolve

这两个 resolves 是两个具有相同名称的不同函数,还是我从根本上不了解正在发生的事情。

最后一行只是等待 sleep 的回调以执行某些功能。

所有这些函数表达式的另一种用法会削弱编译器的优化能力。具体来说,我读到setTimeout利用了eval(),这对于优化是有问题的。

3 个答案:

答案 0 :(得分:0)

那是arrow function

将第一个resolve作为传递给函数的参数。

它也可以这样写:

return new Promise( (resolve) => { 
    return setTimeout(resolve, milliseconds) 
} )

或者这个:(标准功能)

return new Promise( function( resolve ) {
    return setTimeout(resolve, milliseconds)
})

答案 1 :(得分:0)

  

我的理解是,上层解决方案和嵌套的解决方案是两个   不同的功能

它们是相同的。

const sleep = (milliseconds) => {
  return new Promise((resolve) =>          // (1) 'resolve' var refers to a function.
    setTimeout(resolve, milliseconds))     // (2) 'resolve' here refers to (1) above. In this case you, are invoking 'resolve' function without passing any value.
}

sleep(10000).then(()=>{/*Do something*/}); // (3) after 'resolve' from (2) runs, this 'do something function' receives any value from that and runs.

希望这会有所帮助,

干杯!

答案 2 :(得分:0)

此ES6代码段:

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds))
}

翻译成ES5:

const sleep = function(milliseconds){

  return new Promise(function(resolve){

    return setTimeout(resolve, milliseconds);

  }.bind(this));

}.bind(this);

因此,这里只有一个 resolve,而不是两个。

resolve是传递给Promise构造函数的第一个参数,它恰好是一个函数,但肯定不是一个函数表达式。

此后,在“ .then(...)”部分出现了“功能表达式”。

有关Promisearrow functions的更多信息。