构造 Promise
现在我们构造一个promise对象:
new Promise(function (resolve,reject)) {
//要做的事情...
}
通过新建一个Promise 对象好像并没有看出它怎样“更加优雅地书写复杂的异步任务”。我们之前遇到的异步任务都是一次异步,如果需要多次调用异步函数呢?例如,如果我想分三次输出字符串,第一次间隔1秒,第二次间隔4秒,第三次间隔3秒:
实例
setTimeout(function(){
console.log("First");
setTimeout(function (){
console.1og("Second");
setTimeout(function(){
console.log("Third");
},3000);
},4000);
},1000);
使用延迟函数固然可以实现这个功能,但是在一个复杂的程序中,使用函数瀑布实现程序是一件特别繁琐的事情。
我们现在使用Promise来实现:
实例
new Promise(function(resolve, reject){
setTimeout(function (){
console.log("First");
resolve();
},1000);
}).then(function(){
return new Promise(function(resolve,reject)
setTimeout(function (){
console.1og("Second");
resolve();
},4000);
});
}).then(function(){
setTimeout(function (){
console.1og("Third");
},3000);
});
Promise的使用
Promise 构造函数只有一个参数,是一个函数,这个函数在构造之后会直接被异步运行,所以我们称之为起始函数。起始函数包含两个参数resolve和 reject。
当Promise 被构造时,起始函数会被异步执行:
实例
new Promise(function(resolve, reject){
console.1og("Run"); 3});
这段程序会直接输出 Run。
resolve 和 reject 都是函数,其中调用 resolve 代 表一切正常,reject是出现异常时所调用的:
实例
new Promise(function(resolve, reject){
var a=0;
var b=1;
if (b ==θ)reject("Divide zero");
else resolve(a / b);
}).then(function(value){
console.log("a/b="+value);
}).catch(function(err){
console.log(err);
}).finally(function(){
console.log("End");
});
这段程序执行结果是:
1 a/b-0
2 End
Promise 类有 .then().catch()和.finally()三个方 法,这三个方法的参数都是一个函数,then()可以将参数中的函数添加到当前Promise的正常执行序列,catch()则是设定Promise的异常处理序列,finally()是在Promise 执行的最后一定会执 行的序列。.then()传入的函数会按顺序依次执行,有任何异常都会直接跳到catch序列:
实例
new Promise(function(resolve, reject){
console.log(1111);
resolve(2222);
}).then(function (value){
console.1og(value);
return 3333;
}).then(function(value){
console.log(value);
throw "An error";
}).catch(function(err){
console.log(err);
});
执行结果:
1 1111
2 2222
3 3333
4 An error
resolve()中可以放置一个参数用于向下一个then传递一个值,then中的函数也可以返回一个值传递给 then。但是,如果then中返回的是一个Promise 对象,那么下一个 then 将相当于对这个返回的Promise 进行操作,这一点从刚才的计时器的例子中可以看出来。
reject()参数中一般会传递一个异常给之后的catch函数用于处理异常。
但是请注意以下两点:
- resolve 和 reject的作用域只有起始函数,不包括then以及其他序列;
- resolve 和 reject 并不能够使起始函数停止运行,别忘了return。
Promise 函数
上述的“计时器”程序看上去比函数瀑布还要长,所以我们可以将它的核心部分写成一个Promise函数:
实例 :
function print(delay,message){
return new Promise(function (resolve, reject){
setTimeout(function(){
console.log(message);
resolve();
},delay);
});
}
然后我们就可以放心大胆的实现程序功能了:
实例
print(1000,"First").then(function (){
return print(4000,"Second");
}).then(function(){
print(3000,"Third");
})
这种返回值为一个 Promise 对象的函数称作Promise 函数,它常常用于开发基于异步操作的库。
标签:function,resolve,console,函数,Javascript,用法,Promise,reject From: https://www.cnblogs.com/dutianyu/p/18104607