javascript - Promise 中的多个 resolve() 调用返回异步函数
问题描述
我有以下 testAsync 函数,它应该在我调用resolve()
.
async function wait(time) {
await new Promise((resolve, reject) => { setTimeout(resolve, time) });
}
async function testAsync(testParam) {
return new Promise(async (resolve, reject) => {
try {
await wait(2000); // do some async work
if (testParam === 1) {
console.log("test param is equal to 1");
resolve("first IF");
}
if (testParam < 10) {
console.log("test param is smaller than 10");
resolve("second IF");
}
} catch (error) {
reject(error);
}
});
}
(async () => {
let result = await testAsync(1);
console.log(result);
})();
控制台输出:
test param is equal to 1
test param is smaller than 10
first IF
我的问题是,如果我以包含更多resolve()
非排他调用的方式构造代码,则代码确实会解决它遇到的第一个调用,但它不会停止并返回该位置。为什么会继续?是resolve()
不是松散地等于return
?我应该return
在每次resolve()
通话后添加吗?
解决方案
return new Promise(async (resolve, reject) => {
是反模式。在函数前面添加async
将已经返回一个 Promise。new Promise
只能用于将无 Promise 基本异步函数转换为使用 Promise 的函数。
resolve() 不是松散地等于返回吗?
它只是在某种意义上是相等的,它设置了 Promise 的“返回”值,但它不会破坏执行流程。所以是的,return
如果您想防止执行后续代码,您需要在解析之后放置。
但正如我已经说过的,显示的构造无论如何都是反模式,testAsync
应该如下所示:
async function testAsync(testParam) {
await wait(2000); // do some async work
if (testParam === 1) {
console.log("test param is equal to 1");
return "first IF";
}
if (testParam < 10) {
console.log("test param is smaller than 10");
return "second IF";
}
}
而且wait
更有可能这样写:
function wait(time) {
return new Promise((resolve, reject) => { setTimeout(resolve, time) });
}
推荐阅读
- xcode11 - Xcode 11 创建远程 Git 存储库但显示“正在加载帐户所有者”永远不会结束
- null - Unity 3D 警告 CS0414:现场
已分配,但从未使用过它的值 - python-3.x - 为什么我的 Python 3 代码不起作用?(类和对象)
- excel - Excel - 如何在不使用数组公式和辅助列的情况下将唯一值从一列提取到另一列?
- java - Spring Boot Embedded Undertow Server : java.io.IOException: UT000128: Remote peer closed connection before all data can be read
- java - axios 加载数据的速度不够快
- c# - Entity Framework 6 删除更新请求中不存在的所有行
- python - HTTPConnectionPool(host='xxxx', port=y):读取超时。(读取超时=无)在 nginx 服务器上?
- javascript - 在分页中过滤文本字段 Jquery
- html - 外部css文件在压缩文件夹中不起作用