1、Promise 的含义
2、同步、异步、回调函数相关概念
/* 例2.1 */
var x = true;
while(x);
console.log("don't carry out"); //不会执行
上面的例子即同步模式,其中的while是一个死循环,它会阻塞进程,因此第三句console不会执行。
同步模式比较简单,也较容易编写。但问题也显而易见,如果请求的时间较长,而阻塞了后面代码的执行,
体验是很不好的。因此对于一些耗时的操作,异步模式则是更好的选择。
/* 例2.2 */
setTimeout(function() {
console.log('taskA, asynchronous');
}, 0);
console.log('taskB, synchronize');
//while(true);
-------ouput-------
taskB, synchronize
taskA, asynchronous
我们可以看到,定时器延时的时间明明为0,但taskA还是晚于taskB执行。
这是为什么呢?由于定时器是异步的,异步任务会在当前脚本的所有同步 任务执行完才会执行。
如果同步代码中含有死循环,即将上例的注释去掉,那么这个异步任务就不会执行,因为同步任务阻塞了进程。
**WikiPedia对于callback的定义。**
In computer programming, a callback is a piece of executable code that is passed as
an argument to other code, which is expected to call back (execute) the argument
at some convenient time.
可以看出,回调函数是一段可执行的代码段,它以「参数」的形式传递给其他代码,
在其合适的时间执行这段(回调函数)的代码。
**WikiPedia还定义**
The invocation may be immediate as in a synchronous callback,
or it might happen at a later time as in an asynchronous callback.
也就是说,回调函数不仅可以用于异步调用,一般同步的场景也可以用回调。
在同步调用下,回调函数一般是最后执行的。而异步调用下,可能一段时间后执行或不执行(未达到执行的条件)。
3、Promise 的特点和基本用法
- 对象的状态不受外界影响,pending(进行中)、fulfiled(已完成)、rejected(已失败)
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果,状态改变只有两种可能,称为(resolved)
es6规定,Promise对象是一个构造函数,用来生成Promise实例。
扩展构造函数回顾:特殊方法,创建对象时初始化对象,为对象成员变量赋初始值,与new一起使用。
一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
var promise = new promise(function(resove, reject){
// ... some code
if (/*异步成功*/){
resove(value);
} else{
reject(error);。
}
});
let p= new Promise((resolve, reject)=>{
let a1='成功传出去的对象';
let a2='失败传出去的对象';
var timer = setTimeout(function () {
console.log('after resolve');
resolve(a1);
reject(a2);
console.log('after error');
}, 1000);
});
p.then(value=>{
console.log(value);
},error=>{
console.log('.then的第二个参数');
console.log(error)
});
p.catch(error=>{
console.log('.catch');
console.log(error);
});
上面例子的输出效果,出现的第一行是Promise{<pending>},
然后再次输入p 按回车执行打印出来p是这样Promise{<resolved>}
然后点开看 可以看到控制台提示promiseStatus :resolved 说明promise的状态已经成为了resolved
上面例子把resolve(a1)去掉,结果如下: