APICloud 提供的大部分 API 都是异步的,对于刚刚接触 JavaScript 的同学,常常会对 这种异步模式感到困惑。下面通过一个简单的小例子来谈谈这个问题。 先来看看下面的代码。
var online = false;
online = true;
alert(online);
复制代码
很明显,上面的 alert(online) 会弹出 "true"。 我们将 online = true; 放到 setTimeout 函数中
var online = false;
// 一秒钟后执行
setTimeout(function(){
online = true;
}, 1000);
alert(online);
复制代码
此时 alert(online) 会弹出 "false"。为什么? 原因是 setTimeout 将 online = true; 变成了异步的。 setTimeout 执行后,紧随其后的 alert(online); 会立即执行,而此时 online = true; 这行代码还没有执行。 那一定要确保 alert(online); 为 "true" 的话,应该怎么做呢? 答案是使用回调函数。我们来将上面的代码改造一下:
doSomething(function(online) {
alert(online);
});
function doSomething(callback) {
// 一秒钟后执行
setTimeout(function() {
var online = true;
// 如果 callback 存在,则执行 callback
callback && callback(online);
}, 1000);
}
复制代码
这样一来,即使是异步模式,我们也可以获得正确的结果。
【补充知识】
同步和异步的区别
Javascript 语言的执行环境是"单线程"的。在“单线程”环境下,多个任务必须按照顺序一个一个的执行。
如果其中一个任务的耗时很长,其他任务就只能等待,浏览器的整个页面会处于一种阻塞的状态。
为了解决这个问题,JavaScript 才将任务的执行环境分成了同步和异步模式两种:
"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;"异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
以上的描述可能有些不好理解。那我们来换一个更加通俗的例子。
同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。
原文链接:http://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=11066