В настоящее время я пытаюсь отследить ход выполнения цепочки обещаний 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(...)