Javascript Promise用法

构造 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 函数,它常常用于开发基于异步操作的库。

posted @   奇迹会出现  阅读(17)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示