Asynchronism - 单线程中的异步行为

Python 是支持多线程/多进程的一种语言,当我们编写一个带背景音乐的游戏时,为了确保音乐和画面都能运行,我们会给音乐另开一个线程,然后 Python 会在多个线程间来回运行。由于计算机运行速度很快,这就实现了「视觉上同时运行」的效果。

然而 JS 却是一门单线程的语言 … 这让我很不习惯,如果音乐播放 10 秒,那么画面就需要 10 秒以后再变化了吗?为了满足这种同时运行的需求,JS 引入了异步模式(区别于一句等一句的同步执行)。相当于变相的多线程。

React 是个异步的 JS 框架,我用它写了一个 TodoList,过程中没少被异步带进坑里。在我还没认识到有异步这种操作的时候,我一直感到有莫名的 BUG 出现,后来才明白是因为程序的运行并不是同步的。

比如说:

$.ajax({
url: `http://127.0.0.1:8000/api/tasks/${currentTodo.id}`,
type: 'put',
dataType: 'json',
data: currentTodo,
});
this.props.appState.isEditing = false;

这里的 ajax 方法就是典型的异步方法,在它还没执行完的情况下,this.props.appState.isEditing = false; 就开始执行了。。。如果你想要确保第二句必须在第一句执行完之后再执行,ajax 自身提供了回调函数。

$.ajax({
url: `http://127.0.0.1:8000/api/tasks/${currentTodo.id}`,
type: 'put',
dataType: 'json',
data: currentTodo,
success: function() {
    this.props.appState.isEditing = false;
},
});

把第二句话放进去,这样才能确保结果符合你的预期。

这也就是说,当执行完第一行代码,它不会立刻执行下一行,而是去执行它的回调函数。而第二行代码不会等第一行执行完毕才加载,当第一行开始后,第二行也开始了。

这是 JS 中单线程异步行为的明显特征,如果不搞清楚,很容易写出 BUG 来。

学习资料

http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html

http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

你可能感兴趣的:(Asynchronism - 单线程中的异步行为)