代码块1在2秒内执行。
代码块2在4秒内执行。
有人可以解释他们之间的区别吗?
// Code block 1
const one = new Promise(resolve => setTimeout(() => resolve('one'), 2000));
const two = new Promise(resolve => setTimeout(() => resolve('two'), 2000));
(async() => {
console.log(await one);
console.log(await two);
})();
// Code block 2
const one = () => new Promise(resolve => setTimeout(() => resolve('one'), 2000));
const two = () => new Promise(resolve => setTimeout(() => resolve('two'), 2000));
(async() => {
console.log(await one());
console.log(await two());
})();
答案 0 :(得分:2)
在第一个代码块中,这两个Promise都会立即初始化(在声明one
和two
时-您有one = new Promise
和two = new Promise
),因此它们都解析为在同一时间。
在第二个代码块中,仅在调用函数后才创建Promises。由于await
实际上会阻止异步功能,因此
console.log(await one());
console.log(await two());
在await one()
中,您正在调用one
,创建一个Promise,并等待其解决。
然后,在Promise被解析并记录其值之后,console.log(await two())
调用第二个函数创建Promise ,该函数在几秒钟。
答案 1 :(得分:0)
嗯,从某种意义上说,Promise之间没有区别,这全都与何时调用它们有关。
在第一个代码块中,两个Promise在代码行被执行时立即被调用。这意味着在承诺1(P1)之后立即启动承诺2(P2)的计时器。因此,在该示例中,您等待P1,等待2秒钟,然后转到检查P2是否已解析。它基本上已经运行了,因为它已经运行了2秒钟,所以打印结果。
在此微小的修改中,您可以看到我将P2的计时器更改为比P1短,但是它仍会按顺序打印。在闭包内部,您的代码将等待P1解析,然后再继续检查P2,一旦继续进行,它将已经解析并立即执行分辨率回调并打印结果。
const one = new Promise(resolve => setTimeout(() => resolve('one'), 2000));
const two = new Promise(resolve => setTimeout(() => resolve('two'), 1000));
(async () => {
console.log(await one);
console.log(await two);
})();
在第二个代码块中,您最初不会调用Promise,而是将一个和两个变量赋给一个函数-因此最初都不启动任何计时器。第一个console.log调用第一个lambda函数(P1)并等待响应(这需要2秒钟),然后移至下一行并调用“ two”,它开始并等待2秒钟以进行响应。
重要的是要记住,尽管您创建的闭包内部的代码有效地保留了下来并等待Promises的解决,但是程序执行将继续在闭包之外进行。在下面的代码中,您将看到消息立即打印,然后分别是“一”和“两”,分别是两秒和四秒。
const one = () => new Promise(resolve => setTimeout(() => resolve('one'), 2000));
const two = () => new Promise(resolve => setTimeout(() => resolve('two'), 2000));
(async () => {
console.log(await one());
console.log(await two());
})();
console.log ('Promises have been invoked: do other stuff while waiting');