javascript - 我什么时候需要在 javascript 中创建新的 Promise 而不是获取它们?
问题描述
我一直在潜入异步编程的世界。我正在构建一个 ReactJS 应用程序,并在其中对与 mongodb 对话的后端进行了一堆异步调用。我知道 fetch 调用返回承诺并且需要解决,但是您究竟什么时候需要创建自己的承诺,以及您如何知道某些东西是否应该在承诺中?请给出一个真实的例子和一种我可以在精神上处理我的代码并说“好的,这肯定需要包含在一个新的承诺中”的方式
解决方案
需要明确的承诺:
- 使用依赖于回调的异步 JS API 时
- 管理异步流时,例如with
Promise.all
等Promise.race
- 规范化仅有时返回承诺的函数的返回值时
示例:不返回承诺的异步函数
setTimeout // Implemented before promises existed
setInterval
示例:(Good) setTimeout 包装在 Promise 中
await waitFor(5);
function waitFor(howManySeconds) {
return new Promise(resolve => {
setTimeout(resolve, howManySeconds * 1000);
});
}
然而,在代码中经常发现显式承诺作为一种反模式。
示例:(坏)不必要的承诺包装
async function getData() {
// fetch already returns a promise, no need to create another one
return new Promise(resolve => {
const data = await fetch('/some/data')
.then(response => response.json())
resolve(data);
});
}
示例:(好)隐式承诺
async function getData() {
return fetch('/some/data')
.then(response => response.json());
}
示例:(好)使用 promise 进行控制流
// Creates a promise that resolves only when all fruit types are fetched
function getAllFruits() {
return Promise.all([
fetch('/apples'),
fetch('/oranges'),
fetch('/pears'),
]);
}
推荐阅读
- python - 获取列表列表并将元素从另一个列表“分配”到子列表的 Pythonic 方式是什么?
- python - 如何在行级别上比较两个海量 Spark 数据帧并打印差异
- python - TypeError:“浮动”对象不支持项目分配
- css - 如何删除一个css类?
- react-native - 这个错误是什么以及在 React Native App 中使用 Expo.TypeError 有什么问题
- marshalling - BeanIO 中 int 字段的默认填充是什么?
- java - JApplet Restart 添加重复的组件
- sql - 在 SQL Server 中看不到数据库图表选项
- arduino - 使用枚举切换不起作用 - Arduino Mega 2560
- java - 限制Java中的并发线程数