码迷,mamicode.com
首页 > 其他好文 > 详细

Promise

时间:2017-08-21 11:29:31      阅读:100      评论:0      收藏:0      [点我收藏+]

标签: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,则等待一段时间后返回成功,否则返回失败:

 

Promise

标签:doc   运行   ret   可见   png   输出   ict   逻辑   for   

原文地址:http://www.cnblogs.com/ocean-boy/p/7403187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!