是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它能够获取异步操做的消息。解决回调函数嵌套过多的状况编程
const promise =new Promise(function(resolve,reject){ setTimeout(function(){ resolve('执行成功') },3000) }) promise.then(res=>{ console.log(res) }).catch(err=>{ console.log(err) }) console.log(111)
等待三秒后输出 ‘执行成功’,也就是说当异步操做完成,即执行resolve或者reject以后,才会执行then中的操做promise
全部请求都完成时再执行后续操做异步
var p1 = Promise.resolve(3); var p2 = 1337; var p3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([p1, p2, p3]).then(values => { console.log(values); // [3, 1337, "foo"] });
那个请求先执行完成就返回那个请求结果,这个能够把一个请求与setTimeout对比,实现请求超时的效果async
var p1 = new Promise(function(resolve, reject) { setTimeout(resolve, 500, "one"); }); var p2 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, "two"); }); Promise.race([p1, p2]).then(function(value) { console.log(value); // "two" // 两个都完成,但 p2 更快 });
模拟一下常常出现的问题异步编程
function getData(){ return new Promise(function(resolve,reject){ setTimeout(function(){ //模拟一下请求 resolve('执行成功') },3000) }) } function main(){ let data='' getData().then(res=>{ data=res }) console.log(data) console.log('操做完成') setInterval(()=>{ console.log(data) },1000) } main()
运行结果:
函数
能够看到第一个console.log(data)的结果为空,这不难解释,由于main函数内容顺序执行,当getData()的时候异步操做还未完成,因此继续执行下面的操做。当第三秒的时候才执行resolve()而且成功输出data,这也对应了上面promise所说的‘执行resolve或者reject以后,才会执行then中的操做’既然这样事情就简单了,一直等待请求完成不就完事了。
这里更改main函数为网站
async function main() { // var data = await getData()//或者 let data await getData().then((res)=>{ data=res }) console.log(data) console.log('操做完成') }
输出结果:
code
查看更多内容请访问:根号七的网站对象