const example = () => new Promise((resolve) => {
resolve();
console.log('1');
} )
example().then(console.log('3'))
console.log('2');
打印出1 3 2
function create() {
return new Promise(function(resolve, reject) {
resolve();
console.log('1');
});
};
create().then(function() {
console.log('3');
}, function() {
console.log('4');
});
console.log('2');
打印出1 2 3
我每次测试超过十次。但结果是一样的。 为什么会出现这种差异?
答案 0 :(得分:5)
then
接受函数作为参数,而不是函数调用,例如console.log
(它不返回函数,但返回undefined
) 。所以当你这样做时
example().then(console.log('3'))
遇到.then
时,它会立即评估console.log('3')
,并且解释器希望/期望函数调用返回函数,以便它可以放回函数进入.then
链。因此,console.log('3')
会立即打印出来。但是console.log
返回 undefined - 它是而不是一个进入异步.then
链的函数。
它与命名与匿名函数实际上没有任何关系。您的第一个代码段将.then
函数作为参数提供,但第二个代码段将.then
console.log
调用作为参数(立即进行评估,返回undefined)。
只需在第一个代码段的() =>
之前添加console.log
,您就会看到它的行为与第二个代码段完全相同,方法是在主要线程之后使console.log
调用以异步方式运行完成:
const example = () => new Promise((resolve) => {
resolve();
console.log('1');
} )
example().then(() => console.log('3'))
console.log('2');