首页 > 解决方案 > 我什么时候需要在 javascript 中创建新的 Promise 而不是获取它们?

问题描述

我一直在潜入异步编程的世界。我正在构建一个 ReactJS 应用程序,并在其中对与 mongodb 对话的后端进行了一堆异步调用。我知道 fetch 调用返回承诺并且需要解决,但是您究竟什么时候需要创建自己的承诺,以及您如何知道某些东西是否应该在承诺中?请给出一个真实的例子和一种我可以在精神上处理我的代码并说“好的,这肯定需要包含在一个新的承诺中”的方式

标签: javascriptreactjsasynchronouspromise

解决方案


需要明确的承诺:

  • 使用依赖于回调的异步 JS API 时
  • 管理异步流时,例如withPromise.allPromise.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'),
  ]);
}

推荐阅读