跟踪承诺链的状态

时间:2019-03-08 09:27:07

标签: javascript promise

我目前正在尝试跟踪一系列本地es6 Promise的进度,并且想知道实现此目标的“正确”方法是什么。 我已将实际代码简化为以下示例,该示例是链接的诺言的基本集合(实际上,诺言链更长,并且会话状态值会根据整个链的进度在更多位置发生变化):

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时将其添加为诺言的属性,因此可以对其进行检查-但是我不确定向诺言中添加属性是否有风险/ hacky要做的事?像这样(从上面简化):

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(...)

对这种方法的有效性有何想法​​?我可以看到,我可能还需要将会话ID推入最终的返回值中(这样,该属性既存在于Promise中,又存在于已解决/已拒绝Promise的结果值中)。

或者,还有其他处理方式吗?

显而易见的是使函数始终返回参数数组(promise和session_id),但我希望避免总是执行例如:

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

0 个答案:

没有答案