Отслеживание состояния цепочки обещаний - PullRequest
0 голосов
/ 08 марта 2019

В настоящее время я пытаюсь отследить ход выполнения цепочки обещаний es6, и мне интересно, каков «правильный» способ добиться этого. Я упростил реальный код до следующего примера, который представляет собой базовый набор связанных обещаний (на самом деле цепочка обещаний длиннее, а значение состояния сеанса меняется в большем количестве мест в зависимости от прохождения цепочки):

let sessions = {}

const asyncFunc = () => {
  // Get a new id for state tracking
  let session_id = getID()
  sessions.session_id = 'PENDING'
  // Fetch the first url
  let result = api.get(url)
    .then(res => {
      // Return the 'url' property of the fetched data
      return res.url
    })
    .then (url => {
      // Fetch this second url
      let data = api.get(url)
      sessions.session_id = 'SUCCESS'
      // Return the whole data object
      return data
    })
    .catch(err => {
      console.log("ERR", err)
      sessions.session_id = 'ERROR'
    })
  return result
}

asyncFunc()
  .then(res => {
    console.log("URL", url)
  })

Этот код отслеживает состояние функций и сохраняет их в глобальном объекте sessions, но session_id не передается обратно для проверки состояния, пока функция находится в полете.

Один из вариантов, который я рассматриваю, - это добавление session_id в качестве свойства обещания при его возврате, так что это можно проверить - однако я не уверен, что добавление свойства в обещание является рискованным / хакерским вещь которую нужно сделать? Что-то вроде (упрощенно сверху):

const asyncFunc = () => {
  // Get a new id for state tracking
  let session_id = getID()
  sessions.session_id = 'PENDING'
  // Fetch the first url
  let result = api.get(url)
    .then(...)
    .then(...)
    .catch(...)

  // Add the session_id to the promise
  result.session_id = session_id
  return result
}

let func = asyncFunc()
let status =sessions[func.session_id]
func.then(...)

Есть мысли по поводу обоснованности такого подхода? Я вижу, что мне, вероятно, также нужно будет вставить идентификатор сеанса в окончательное возвращаемое значение (чтобы свойство существовало как в обещании, так и в результирующем значении разрешенного / отклоненного обещания).

В качестве альтернативы, есть ли другие способы справиться с этим?

Очевидным является то, чтобы функция всегда возвращала массив аргументов (обещание и session_id), но я бы предпочел избегать необходимости всегда делать, например ::

let func = asyncFunc()
let status =sessions[func[1]]
func[0].then(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...