【问题标题】:When do I need to create new Promises in javascript not fetch them? [closed]我什么时候需要在 javascript 中创建新的 Promise 而不是获取它们? [关闭]
【发布时间】:2020-12-28 19:15:12
【问题描述】:
我一直在潜入异步编程的世界。我正在构建一个 ReactJS 应用程序,并在其中对与 mongodb 对话的后端进行了一堆异步调用。我知道 fetch 调用返回承诺并且需要解决,但是你什么时候需要创建自己的承诺,你怎么知道某些东西是否应该在承诺中?请举一个真实的例子和一种我可以在精神上处理我的代码并说“好的,这肯定需要包含在一个新的承诺中”
【问题讨论】:
标签:
javascript
reactjs
asynchronous
promise
【解决方案1】:
需要明确的承诺:
- 使用依赖回调的异步 JS API 时
- 管理异步流时,例如使用
Promise.all、Promise.race 等
- 规范化仅有时返回承诺的函数的返回值时
示例:不返回承诺的异步函数
setTimeout // Implemented before promises existed
setInterval
示例:(很好)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'),
]);
}
【解决方案2】:
有四种一般情况下自己构造 Promise 很有用:
- 当您有一个使用回调的现有 API 并且想要使用 Promises 提供的标准接口时(包括当您想要等待一个只会触发一次的事件时,至少只触发一次您关心的事件)。
- 当你模拟返回承诺的东西时
- 如果您有一个有条件地同步或异步执行某些操作并希望提供一致的返回值的函数。
- 当您使用应该异步执行的 JS 接口(例如 C++ 中的 Node.js 模块)编写 JavaScript 之外的内容时