Вернуть результат функции с помощью команды throw. Это правильный способ использования команды throw? - PullRequest
0 голосов
/ 05 февраля 2020

Один из моих коллег отправил мне этот блок кода:

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
}

Затем я увидел, что он возвращает данные обещания с throw. Это правильный способ использования throw?

1 Ответ

0 голосов
/ 05 февраля 2020

Есть несколько проблем с кодом и вашим пониманием кода ...

  1. data не дата, возвращаемая обещанием. Это обещание . Вы можете получить данные обещания только после разрешения обещания. В этом случае данные обещания на самом деле x
  2. Использование ключевого слова throw всегда вызовет исключение, которое, если его не обработать, приведет к ошибке. В этом случае функция всегда будет выдавать исключение, поэтому я не уверен, какая цель здесь.

Чтобы фактически получить значение обещания в этой функции, есть два способа. Либо вы 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
  });

}

Надеюсь, это поможет ...

...