promise失败,promise解决了什么意思
本文将和大家分享使用promise时的五个常见错误,帮你快速避坑。希望对你有帮助!
Promise提供了一种优雅的方式来处理JS中的异步操作。这也是避免“回调到地狱”的解决方法。但是,了解内容的开发者并不多。所以很多人在实践中经常出错。【相关推荐:javascript学习教程】
本文介绍了使用promise的五个常见错误,希望你能避免。
1.避免 Promise 地狱
通常,承诺是用来避免召唤回地狱的。但是滥用它们也会导致承诺成为地狱。
用户登录(用户)。然后(功能(用户){
getArticle(用户)。然后(功能(文章){
showArticle(文章)。then(function(){
//您的代码在这里.
});
});
});在上面的例子中,我们为userLogin、getararticle和showararticle嵌套了三个promise。这样一来,复杂度会随着代码行数成比例增加,可能会变得不可读。
为了避免这种情况,我们需要解开代码,从第一个then返回getArticle,然后在第二个then中处理它。
用户登录(“用户”)。然后(getArticle)。然后(展示文章)。then(function(){
//您的代码在这里.
});2. 在 Promise 中使用 try/catch 块
通常,我们使用try/catch块来处理错误。但是,不建议在Promise对象中使用try/catch。
这是因为如果有任何错误,Promise对象将在catch中自动处理。
新承诺((解决,拒绝)={
尝试{
const data=doThis();
//做点什么
resolve();
} catch (e) {
拒绝(e);
}
})。然后(data=console.log(data))。catch(错误=console.log(错误));在上面的例子中,我们在Promise中使用了try/catch块。
然而,Promise本身会捕捉其范围内的所有错误(甚至是错别字),而不需要try/catch块。它确保在执行过程中抛出的所有异常都被捕获并转换为拒绝的承诺。
新承诺((解决,拒绝)={
const data=doThis();
//做点什么
解决()
})。然后(data=console.log(data))。catch(错误=console.log(错误));注意:必须使用。承诺块中的catch()块。否则,您的测试用例可能会失败,并且应用程序可能会在生产阶段崩溃。
3. 在 Promise 块内使用异步函数
Async/Await是一种高级语法,用于处理同步代码中的多个承诺。当我们在函数声明之前使用async关键字时,它将返回一个承诺,我们可以使用await关键字来停止代码,直到我们等待的承诺被解决或拒绝。
但是,当你把一个 Async 函数放在一个 Promise 块里面时,会有一些副作用。
假设我们想在Promise块中做一个异步操作,所以我们使用async关键字,但是不幸的是,我们的代码抛出了一个错误。
这样,即使我们使用catch()块或者在try/catch块内部等待您的承诺,我们也无法立即处理这个错误。请看下面的例子。
//这段代码不能处理错误
新承诺(async ()={
抛出新错误(“消息”);
}).catch(e=console . log(e . message));
(async ()={
尝试{
等待新的承诺(async ()={
抛出新错误(“消息”);
});
} catch (e) {
console.log(电子邮件);
}
})();当我在Promise块中遇到异步函数时,我试图将异步逻辑放在Promise块之外以保持其同步性。10次有9次可以成功。
但是,在某些情况下,可能需要异步函数。在这种情况下,别无选择,只能用try/catch块手动管理它。
新承诺(异步(解决,拒绝)={
尝试{
抛出新错误(“消息”);
} catch(错误){
拒绝(错误);
}
}).catch(e=console . log(e . message));
//使用异步/等待
(async ()={
尝试{
等待新的承诺(异步(解决,拒绝)={
尝试{
抛出新错误(“消息”);
} catch(错误){
拒绝(错误);
}
});
} catch (e) {
console.log(电子邮件);
}
})();4.在创建 Promise 后立即执行 Promise 块
至于下面的代码片段,如果我们把代码片段放在HTTP请求被调用的地方,它会被立即执行。
const my Promise=new Promise(resolve={
//发出HTTP请求的代码
解决(结果);
});原因是这段代码被包装在一个Promise构造函数中。但是,有些人可能认为只有在myPromise的then方法执行之后才会触发。
然而,真相并非如此。相反,当一个Promise被创建时,回调被立即执行。
这意味着当myPromise建立后到达下面一行时,HTTP请求可能已经在运行,或者至少处于预定状态。
Promises 总是急于执行过程。
但是,如果以后想执行承诺,该怎么办?如果我现在不想发出HTTP请求怎么办?承诺中有没有什么神奇的机制能让我们做到这一点?
答案是使用函数。函数是一个耗时的机制。只有当开发人员用()显式调用它们时,它们才会被执行。简单的定义一个函数并不能给我们带来什么。所以,让Promise偷懒最有效的方法就是把它包装在一个函数里!
const createMyPromise=()=新承诺(resolve={
//HTTP请求
解决(结果);
});对于HTTP请求,Promise构造函数和回调函数只有在函数执行时才会被调用。所以现在我们有了一个懒惰的承诺,只有在需要的时候才会执行。
5. 不一定使用 Promise.all() 方法
如果你已经工作多年,你应该已经知道我在说什么了。如果有许多不相关的承诺,我们可以同时处理它们。
承诺是并发的,但是如果一个一个的等,时间太长了。Promise.all()可以节省很多时间。
const { promisify }=require( util );
const sleep=promisify(setTimeout);
异步函数f1() {
等待睡眠(1000);
}
异步函数f2() {
等待睡眠(2000年);
}
异步函数f3() {
等待睡眠(3000);
}
(async ()={
console . time(“sequential”);
等待f1();
await F2();
await F3();
console . time end( sequential );
})();上述代码的执行时间约为6秒。但如果我们用Promise.all()代替,会减少执行时间。
(async ()={
console . time(“concurrent”);
await Promise.all([f1(),f2(),F3()]);
console . time end( concurrent );
})();总结
在这篇文章中,我们讨论了使用Promise时经常犯的五个错误。但是,可能还是有很多简单的问题需要认真解决。
如有更多相关错误,欢迎留言讨论。
有关编程的更多信息,请访问:编程入门!以上是快速避坑。下面就来说说使用promise的5个常见错误吧!更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。