码迷,mamicode.com
首页 > 其他好文 > 详细

Promise(三)

时间:2020-07-03 12:07:32      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:结束   设置   web   res   seconds   回调   event   http   hello   

1. 事件循环和 Promise

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop

https://zhuanlan.zhihu.com/p/33058983

const?s?=?new?Date().getSeconds();
console.log(s);
setTimeout(function?()?{
??//?输出?"2",表示回调函数并没有在?500?毫秒之后立即执行
??console.log("s?is?:?"?+?s);
??console.log("Ran?after?"?+?(new?Date().getSeconds()?-?s)?+?"?seconds");
},?500);

console.log("after?setTimeout...");

while?(true)?{
??//???console.log("loop...");
??if?(new?Date().getSeconds()?-?s?>=?2)?{
????console.log("Good,?looped?for?2?seconds");
????break;
??}
}

//?23
//?after?setTimeout...
//?Good,?looped?for?2?seconds
//?s?is?:?23
//?Ran?after?2?seconds

在上面的例子中,while 循环一直在占用消息队列,直到 2 秒之后循环结束,此时 setTimeout 的 500ms 早已到期,所以立即执行,输出 2。

const?promise?=?new?Promise(function?(resolve,?reject)?{
???setTimeout(function?()?{
????console.log("hello");
??},?0);
	resolve("ok");
??console.log("end");
});

promise.then(function?(value)?{
??console.log(value);
});

//?end
//?ok
//?hello

在这个例子中,即使 setTimeout 的 delay 设置为 0,resolve 还是先于 setTimeout 执行。

2. return Promise.reject(error);

axios 的 request 和 response 的拦截器经常这么写,其实就是对一个错误进行抛出,和 throw 效果一样,需要在接下来的 catch 中进行捕获。

let?foo?=?new?Promise((resolve,?reject)?=>?{
??reject(‘hwhw‘);
});
foo
??.then(
????(res)?=>?{
??????console.log(‘then...‘);
??????console.log(res,?x);
????},
????(error)?=>?{
??????console.log(‘then--error...‘);
??????console.log(error);
??????//?return?Promise.reject(error?+?‘again‘);?//?和下面的?new?Error?作用一样,都是被?catch?捕获
??????throw?new?Error(error?+?‘again2‘);
????}
??)
??.catch((error)?=>?{
????console.log(‘catch...‘);
????console.log(error.message);
??});

Promise(三)

标签:结束   设置   web   res   seconds   回调   event   http   hello   

原文地址:https://www.cnblogs.com/ainsliaea/p/13229341.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!