【发布时间】:2021-06-19 14:11:39
【问题描述】:
我是 javascript 的新手,我一直在学习 Promise,最近我开始研究一些简单的列表,该列表以随机延迟 (setTimeout) 检索,我认为这是一个经典的。在尝试并进行了一些研究之后,我发现我发布的帖子对我有很大帮助,而且效果很好,但是在查看了该帖子对我所做的建议之后,我注意到差异是两个括号......我一直在阅读和试图理解为什么括号会产生如此大的差异(两个选项都有效),但我不明白。
有人能解释一下有什么区别吗?我提到的括号在函数 loadIng() 的第 5 行和第 12 行中,第一行的左括号和第二行的右括号。
{
new Promise(resolve => {
...
})
}
如果我运行带括号的代码,它会同步运行,但如果我不带括号运行它,它会异步运行......我真的不明白。
function loadIngs() {
p = Promise.resolve();
for (let [k, v] of someArray) {
p = p.then(() =>
{new Promise(resolve => { //this
delay = Math.random() * 2000;
console.log(`${k}:${v} comes delayed for ${delay}`)
setTimeout(() => {
console.log("executes some function")
resolve();
}, delay);
})} //this
);
}
}
【问题讨论】:
-
嗨,我建议生成
minimal reproducible example- 意思是 - 删除所有与您的代码不直接相关的代码。这包括您提供的所有 HTML 和 CSS 以及大部分 JS 脚本。通过编写一个简洁的示例,我们可以更轻松地为您提供帮助。 -
请展示一个异步运行的可运行示例。您引用的括号似乎是函数定义的一部分(尽管尚不清楚您在谈论代码中的哪个示例),因此只要调用该函数,代码就会运行。
-
如果您在谈论
new Promise()函数中的loadIngs(),那么括号是可选的。可以使用或不使用括号声明单个语句箭头函数体。这是一个简单的例子:setTimeout(() => console.log("hi"), 100)或setTimeout(() => { console.log("hi") }, 100)。这些是同一回事。这里的这两段代码没有同步/异步的区别,也没有任何执行上的区别。 -
@jfriend00 确认同样的事情,我签入调试器始终提供异步,同时在文档中明确写入
The Promise object represents the eventual completion (or failure) of an asynchronous operation and its resulting value.括号是可选的,如果您使用它们超过一行如果没有脚本,请不要使用它们。 -
你需要
returnp = p.then(() => …)链中的promise,否则函数不会链接任何东西。除非您添加return关键字,否则带大括号的语法将返回undefined。
标签: javascript es6-promise curly-braces asynchronous-javascript