承诺 settimeout 最佳实践中的 resolve 'function' 是什么?
what is the resolve 'function' in the promise settimeout best practice?
在 javascript 中学习异步时,我在 javascript 中遇到了 sleep() 函数的最佳实践。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
What is the JavaScript version of sleep()?
在 setTimeout
的 w3school 文档中,它说第一个参数必须是一个函数,该函数将在计时器解析时调用。那么如果 resolve 是一个函数,它是否只是因为它从未实现而被跳过?
这里到底发生了什么?我有点阅读障碍,如果这很明显,我很抱歉。
带有单个参数的 arrow function 参数列表周围的括号是可选的。这两种语法完全等同:
resolve => …
(resolve) => …
您使用哪一个是一种风格偏好,而不是最佳实践问题。
具有多个参数的箭头函数参数列表始终需要括号。
const add = (a, b) => a + b;
add(1, 2)
// returns 3
括号中不表示函数调用,就像(ms)
不是function sleep(ms)
中的函数调用一样。
它们是一样的。
您提供的第一个示例,如果完整编写,将如下所示:
函数睡眠(毫秒){
return 新承诺((解决)=> {
return 设置超时(解决,毫秒)
});
}
(注意:这是您的第一个函数,而不是您的第二个 - 虽然它们本质上是相同的我想强调这是对您的第一个函数的重写)
也就是说,你传递的是匿名函数:
(resolve) => {
return setTimeout(resolve, ms)
}
到Promise
。但是,箭头函数的语法允许一些快捷方式。
第一个捷径是,如果函数只有一个语句,则可以省略 {}
。也就是说上面的函数在shorthand中可以写成:
(resolve) => setTimeout(resolve,ms);
所以
(resolve) => {
return setTimeout(resolve, ms)
}
和
(resolve) => setTimeout(resolve,ms);
是完全一样的功能但是第二个版本写在shorthand.
另一个快捷方式是,如果一个函数只接受一个参数,您可以删除参数周围的 ()
。所以上面的函数可以重写为:
resolve => setTimeout(resolve,ms);
注意这与:
完全相同
(resolve) => {
return setTimeout(resolve, ms)
}
只写在shorthand.
补充回答。
你问了
So if resolve is a function, is it just skipped because its never implemented?
你错了。它并非从未实施过。它是由写 Promise
class.
的人实现的
Promise
class 的作用如下:
如果你称我为构造函数,那么你需要将一个带有两个参数的函数传递给我。稍后我将使用两个参数调用您的函数,这两个参数都是您可以调用的函数。如果你调用第一个函数,那么我会假设你没问题。如果你调用第二个函数,那么我会假设有一个错误。
仅此而已。这两个参数(通常称为 resolve
和 reject
但你可以给它们起任何名字)由 Promise
class 定义,并在 [=17] 时传递给你的函数=] class 调用你的函数。
这是我自己的 Promise
class 的示例实现,用于演示发生了什么:
// Warning. For illustration purposes only. This class does not
// fully implement the Promise design pattern as specified by ECMA262:
class Promise {
constructor (yourfunction) {
this.result = undefined;
this.error = undefined;
function resolve (x) {this.result = x};
function reject (y) {this.error = y};
yourfunction(resolve,reject); // calling your function!!
}
then (yourcallback) {
yourcallback(this.result);
}
catch (yourcallback) {
if (this.error) yourcallback(this.error);
}
}
在 javascript 中学习异步时,我在 javascript 中遇到了 sleep() 函数的最佳实践。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
What is the JavaScript version of sleep()?
在 setTimeout
的 w3school 文档中,它说第一个参数必须是一个函数,该函数将在计时器解析时调用。那么如果 resolve 是一个函数,它是否只是因为它从未实现而被跳过?
这里到底发生了什么?我有点阅读障碍,如果这很明显,我很抱歉。
带有单个参数的 arrow function 参数列表周围的括号是可选的。这两种语法完全等同:
resolve => …
(resolve) => …
您使用哪一个是一种风格偏好,而不是最佳实践问题。
具有多个参数的箭头函数参数列表始终需要括号。
const add = (a, b) => a + b;
add(1, 2)
// returns 3
括号中不表示函数调用,就像(ms)
不是function sleep(ms)
中的函数调用一样。
它们是一样的。
您提供的第一个示例,如果完整编写,将如下所示:
函数睡眠(毫秒){ return 新承诺((解决)=> { return 设置超时(解决,毫秒) }); }
(注意:这是您的第一个函数,而不是您的第二个 - 虽然它们本质上是相同的我想强调这是对您的第一个函数的重写)
也就是说,你传递的是匿名函数:
(resolve) => {
return setTimeout(resolve, ms)
}
到Promise
。但是,箭头函数的语法允许一些快捷方式。
第一个捷径是,如果函数只有一个语句,则可以省略 {}
。也就是说上面的函数在shorthand中可以写成:
(resolve) => setTimeout(resolve,ms);
所以
(resolve) => {
return setTimeout(resolve, ms)
}
和
(resolve) => setTimeout(resolve,ms);
是完全一样的功能但是第二个版本写在shorthand.
另一个快捷方式是,如果一个函数只接受一个参数,您可以删除参数周围的 ()
。所以上面的函数可以重写为:
resolve => setTimeout(resolve,ms);
注意这与:
完全相同(resolve) => {
return setTimeout(resolve, ms)
}
只写在shorthand.
补充回答。
你问了
So if resolve is a function, is it just skipped because its never implemented?
你错了。它并非从未实施过。它是由写 Promise
class.
Promise
class 的作用如下:
如果你称我为构造函数,那么你需要将一个带有两个参数的函数传递给我。稍后我将使用两个参数调用您的函数,这两个参数都是您可以调用的函数。如果你调用第一个函数,那么我会假设你没问题。如果你调用第二个函数,那么我会假设有一个错误。
仅此而已。这两个参数(通常称为 resolve
和 reject
但你可以给它们起任何名字)由 Promise
class 定义,并在 [=17] 时传递给你的函数=] class 调用你的函数。
这是我自己的 Promise
class 的示例实现,用于演示发生了什么:
// Warning. For illustration purposes only. This class does not
// fully implement the Promise design pattern as specified by ECMA262:
class Promise {
constructor (yourfunction) {
this.result = undefined;
this.error = undefined;
function resolve (x) {this.result = x};
function reject (y) {this.error = y};
yourfunction(resolve,reject); // calling your function!!
}
then (yourcallback) {
yourcallback(this.result);
}
catch (yourcallback) {
if (this.error) yourcallback(this.error);
}
}