简短回答:您需要检查调用者并查找异步操作。
详细回答:
回调是一种简单的模式,其中将函数作为参数传递给高阶函数,并在其内部或更深层次的堆栈中被调用。
let mySynchronousFunction = () => 'Hello';
let myHigherOrderFunction = aFunc => {
return (aFunc() || 'Goodbye') + ' world!';
};
一旦有会阻塞主线程的I/O操作,它将“分支出”并继续执行。
如果我们继续之前的示例,我们将观察到以下行为:
let myAsyncFunction = () => {
return http.get('http://some.document')
.then(response => console.log(response)
);
};
myHigherOrderFunction(mySynchronousFunction);
myHigherOrderFunction(myAsyncFunction);
这里发生的是主线程一直执行到必须等待I/O时,它不会在此处阻塞,而是继续执行下一个指令,并记录当I/O操作不再被阻塞时需要执行的位置。
因此,在我们的代码中要评估的下一个表达式是:
return expression
但是我们的表达式分叉了,因此它返回未定义。因此,我们只剩下:
return undefined
这意味着我们传递了一个异步函数的高阶函数在调用aFunc()时得到了undefined。
一旦I/O完成,主线程返回到它离开的地方,即传递给Promise处理程序then的函数。此时,执行线程已分支并与主“线程”分离。
现在回答你的问题:
当调用它的高阶函数同步调用时,回调将是同步的。相反,如果它在异步操作的执行分支上下文中被调用,它将是异步的。
这意味着您需要检查传递回调的高阶函数正在做什么并查找异步操作。
在您的问题的背景下,让我们检查以下代码(HOF = 高阶函数):
let mySynchronousHOC = aFunc => aFunc('Hello world!');
let myAsyncHOC = aFunc => {
http.get('http://hello.com')
.then(response => aFunc('Goodbye world!')
);
};
myAsyncHOC(msg => {
console.log(msg);
});
mySynchronousHOC(msg => {
console.log(msg);
});
其结果将为:
'Hello world'
'Goodbye world'
在这里,我们知道myAsyncHOC是异步的,因为它执行了一个I/O操作。