我目前正在尝试跟踪一系列本地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(...)