标签:doc 运行 ret 可见 png 输出 ict 逻辑 for
在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ajax</title> </head> <body> <script> ‘use strict‘; function callback(){ console.log(‘Done‘); } console.log(‘before setTimeout()‘); setTimeout(callback, 3000); //3秒后调用callback函数 console.log(‘after setTimeout()‘); </script> </body> </html>
结果:
你会发现Done是在前俩个输出之后隔了3秒才输出的噢,这样就用函数实现了异步机制,不会阻塞后面的执行语句。
可见,异步操作会在将来的某个时间点触发一个函数调用。
AJAX就是典型的异步操作。以上一节的代码为例:
request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { return success(request.responseText); } else { return fail(request.status); } } }
把回调函数success(request.responseText)
和fail(request.status)
写到一个AJAX操作里很正常,但是不好看,而且不利于代码复用。
有没有更好的写法?比如写成这样:
var ajax = ajaxGet(‘http://...‘); ajax.ifSuccess(success) .ifFail(fail);
这种链式写法的好处在于,先统一执行AJAX逻辑,不关心如何处理结果,然后,根据结果是成功还是失败,在将来的某个时候调用success
函数或fail
函数。
古人云:“君子一诺千金”,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。
Promise有各种开源实现,在ES6中被统一规范,由浏览器直接支持。先测试一下你的浏览器是否支持Promise:
‘use strict‘; new Promise(function () {}); // 直接运行测试: alert(‘支持Promise!‘);
我们先看一个最简单的Promise例子:生成一个0-2之间的随机数,如果小于1,则等待一段时间后返回成功,否则返回失败:
标签:doc 运行 ret 可见 png 输出 ict 逻辑 for
原文地址:http://www.cnblogs.com/ocean-boy/p/7403187.html