Javascript承诺:匿名和非匿名回调之间有什么区别吗?

时间:2018-04-05 00:39:26

标签: javascript promise es6-promise

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

我每次测试超过十次。但结果是一样的。 为什么会出现这种差异?

1 个答案:

答案 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');