Return 函数结果 "throw" 这是使用 throw 的正确方法吗?

Return function result with "throw" is this correct way to use throw?

我的一位同事发给我这个代码块:

export const getFieldChoice = (key, listName, fieldName) => {
  const value = cache.get(key) || { status: "new", data: null }

  if (value.status === "resolved") {
    return value.data
  }
  const data = spApi.lists.getByTitle(listName).fields.getByInternalNameOrTitle(fieldName).select('Choices').get().then(x => {
    value.data = x
    value.status = "resolved"
    cache.set(key, value)
  })
  throw data
}

然后我看到他returns的承诺数据是throw。这是使用 throw 的正确方法吗?

代码和您对代码的理解存在一些问题...

  1. data不是承诺返回的日期。 这是诺言。您只能在 promise 解析时获取 promise 的 数据。这样的话,promise的数据其实就是x
  2. 使用throw关键字总是会引发异常,如果不处理,会导致错误。在这种情况下,该函数将始终抛出异常,所以我不确定这里的目标是什么。

要在此函数中实际获取 promise 的值,有两种方法。您 await 承诺或提供回调函数以在承诺解决时调用...

Async/Await方法

export const getFieldChoice = async (key, listName, fieldName) => {
  const value = cache.get(key) || { status: "new", data: null }
  if (value.status === "resolved") return value.data;

  const data = await spApi.lists.getByTitle(listName).fields.getByInternalNameOrTitle(fieldName).select('Choices').get();

  value.data = data;
  value.status = "resolved"
  cache.set(key, value)

  return value;
}

然后就是这样使用

import { getFieldChoice } from "path/to/file";

async function caller () {
  try {
    const key = "key";
    const listName = "list name";
    const fieldName = "field name";

    const data = await getFieldChoice(key, listName, fieldName);
    // Rest of function logic
  } catch (err) {
    // Handle any error
  }
}

回调方式

export const getFieldChoice = (key, listName, fieldName, callback) => {
  const value = cache.get(key) || { status: "new", data: null }
  if (value.status === "resolved") return value.data;


 spApi.lists.getByTitle(listName).fields.getByInternalNameOrTitle(fieldName).select('Choices').get().then(data => {
    value.data = data;
    value.status = "resolved"
    cache.set(key, value)

    callback(null, value);
  }).catch(err => {
    callback(err);
  });
}

然后就是这样使用

import { getFieldChoice } from "path/to/file";

function caller () {
  const key = "key";
  const listName = "list name";
  const fieldName = "field name";

  getFieldChoice(key, listName, fieldName, (err, value) => {
    if (err) {
      // Handle any error
    }

    // Rest of function logic
  });

}

希望这对您有所帮助...