为啥要用到Promise
渣瓦死亏破特是是基于单线程的,的事件循环概念构建而成的,同一个时间内只能允许一个代码在执行,和C艹和Java相反,它们支持多个不同的代码同时执行。
JavaScript引擎同一个时刻只能执行一个代码块。(Node.js不需要),所以以前的s使用单线程的方式为:
function callback() {
console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒钟后调用callback函数
console.log('after setTimeout()');
然后控制台会输出
before setTimeout()
after setTimeout()
(等待1秒后)
Done
Promise使用方法
所以我们可以使用ES6里的一个最新标准Promise函数
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value); //成功返回值
} else {
reject(error); 、、失败返回值
}
});
这里面传两个参数,resolve和reject,当成功的时候调用resolve,失败的时候调用reject。
如果创建完实例,还可以利用then来确定是否使用Promise进行异步编程,
promise.then(function(value) {
// success
}, function(error) {
// failure这里可以不写,默认一个函数是成功的状态。(和node.js错误优先有区别)
});
可以利用Promise来进行以下操作,
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});
}
timeout(100).then((value) => {
console.log(value);
});
这个操作的意思是,通过传入一个秒数,来返回一个Promise实例,得到的resolve用setTimeout进行延时执行,然后得到的resolve用then进行调用,调用的值用cosole.log进行输出。
Promise用ES5如何解决
首先我们用伪Promise解决
var fn=function(resolve, reject){
var number=Math.random();
if(number<=0.5){
resolve('less than 0.5');
}else{
reject('greater than 0.5');
}
}
var p=new Promise(fn);
p.then(function(data){
console.log('resolve: ', data);
}, function(data){
console.log('reject: ', data);
})
这里var的一个p是Promise的实例,所以当运行 p=new Promise(fn)这条语句的时候,fn函数就已经在执行了,然而,p.then这个方法是在后面才定义了resolve和reject,那么为何fn函数能够知道resolve和reject函数,