0

我是 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
        );
    }
}
4

1 回答 1

1

这里的区别与箭头函数的自动返回值有关,该箭头函数在单个语句函数体周围不使用括号。

如果您在谈论new Promise()inloadIngs()函数,请在此处:

function loadIngs() {
    p = Promise.resolve();
    for (let [k, v] of ings) {
        p = p.then(() => 
            {new Promise(resolve => {
                delay = Math.random() * 2000;
                console.log(`${k} comes delayed for ${delay}`)
                setTimeout(() => {
                    setIng(k, v);
                    resolve();
                }, delay);
            })}
        );
    }
}

然后周围的括号new Promise()是可选的。

可以使用或不使用括号声明单个语句箭头函数体。这是一个简单的例子:

setTimeout(() => console.log("hi"), 100) 

setTimeout(() => { console.log("hi") }, 100)

这些几乎是一回事。由于函数体是单个语句console.log("hi"),箭头函数体可以单独存在,也可以用括号括起来。两者都可以,并为返回值生成相同的执行。如果你使用,那么如果你想要一个特定的返回值brackets,那么你需要一个声明。return如果没有括号value,单个语句的 the 会自动成为该箭头函数的返回值。

此返回值在您的承诺示例中有所不同。所以,对于函数中的p.then(() => ...)结构。loadIngs()它可以是:

p.then(() => { return new Promise(...) })

或者可以是:

p.then(() => new Promise(...) )

这两个执行相同。但是,请注意,这与您的代码中显示的并不完全相同。我return在前面加了一个new Promise()。当您删除return,然后:

p.then(() => { new Promise(...) })

箭头函数没有返回值。这意味着当您创建一个新的 Promise 时,您不会从.then()处理程序中返回它,因此它不会链接到父 Promise 链中,并且您会获得多个独立的 Promise 链。

这将产生执行差异,并且可能与您说“异步运行”时所说的有关。这并不完全是我要描述的方式,但它确实会在事情运行的时间上产生差异,因为在一种情况下,您有一个链接的 Promise 链,而在另一种情况下,您有两个独立的、独立的 Promise 链。

于 2021-06-19T16:21:02.193 回答