Javascript承诺:匿名回调和非匿名回调之间有什么区别吗?
打印出1 3 2Javascript承诺:匿名回调和非匿名回调之间有什么区别吗?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,打印出1 3 2 const example = () => new Promise((resolve) => { resolve(); console.log('1'); } ) example().then(console.log('3')) console.log('2'); 打印出1 2 3 我每次都测试了十多次。但结果是一样的。 为什么会出现这种差异?然后接受函数作为参数,而不是函数调用,例如console.log(它不返回函数,但返回未定义的)。所以当
const example = () => new Promise((resolve) => {
resolve();
console.log('1');
} )
example().then(console.log('3'))
console.log('2');
打印出1 2 3
我每次都测试了十多次。但结果是一样的。
为什么会出现这种差异?
然后
接受函数作为参数,而不是函数调用,例如console.log
(它不返回函数,但返回未定义的)。所以当你这么做的时候
example().then(console.log('3'))
当遇到.then
时,它立即计算控制台.log('3')
,解释器希望/期望函数调用返回函数,以便将返回的函数放入链中。因此,console.log('3')
会立即打印出来。但是console.log
返回未定义的-它不是进入异步链的函数
它实际上与命名函数和匿名函数没有任何关系。第一个代码段给出了。然后
一个函数作为参数,但第二个代码段给出了。然后
一个控制台.log
调用作为参数(立即计算并返回未定义)
只需在第一个代码段的控制台.log
之前添加()=>
,您就会看到它的行为与第二个代码段相同,方法是在主线程完成后异步运行控制台.log
调用:
const-example=()=>新承诺((解析)=>{
解决();
console.log('1');
} )
示例()。然后(()=>console.log('3'))
console.log('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');