在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。
通常我们用得较多的是setTimeout来做一个回调,但本文说得是Promise这个高大尚的es6新对象,
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。简单的说它的回调函数会在整个html执行结束后它再执行。
<script>
console.log('我是顺序运行的1号');
// 回调测试1,带promise实例化时的参数
function test1(value){
console.log('回调测试1')
return value
}
// 回调测试2,不带promise实例化时的参数
function test2(){
console.log('回调测试2')
return arguments[0]
}
// 创造了一个Promise实例
let p = new Promise(function (resolve, reject) {
console.log('创造了一个Promise实例');
//异步操作成功时调用,并将异步操作的结果,作为参数传递出去
resolve(666);
});
console.log('我是顺序运行的2号');
// 方法一:最简便的,拿到的是创造Promise实例时给resolve的参数
p.then(function(result) {
// success
console.log('方法一回调成功结果是:'+result)
}, function(error) {
// failure
console.log('failure1:'+error)
});
// 方法二:先执行指定的函数再回调,test1这时就是resovle,所以参数是666
p.then(test1)
.then(function (result) {
console.log('方法二回调成功结果是:' + result);
}, function(error) {
// failure
console.log('failure2:'+error)
});
// 方法三:先执行指定的函数再回调,test1这时就是resovle,所以默认参数是arguments里面也有666
p.then(test2)
.then(function (result) {
console.log('方法三回调成功结果是:' + result);
}, function(error) {
// failure
console.log('failure3:'+error)
});
console.log('我是顺序运行的3号');
</script>