В приведенном ниже коде я хотел бы проверить, что обратный вызов выполняется из lastRequest, поэтому я проверяю thisPromise
чтобы узнать, thisPromise
ли он с latestRequest
. Очевидно, что thisPromise
не работает. Есть ли способ получить текущее обещание?
let latestRequest = MyLib
.retrieve(getFilteredQuery(filters, queries, user))
.then(res => {
// Checking whether this is the latest request handler
if (latestRequest === thisPromise) {
updateData(res)
}
})
.catch(err => {
console.error(err)
})
Мой вариант использования - для обработки запросов API. Я хочу, чтобы данные обновлялись для последнего запроса. Запросы могут занять совсем другое время, и иногда более ранний запрос возвращается позже и перезаписывает последний запрос. Если вы знаете хороший способ справиться с этим, сообщите мне.
Нет способа получить ссылку на объект обещания. .then
был вызван внутри обработчика, поставленного. .then
.
Одно из предложений заключается в том, чтобы назначить обработчику порядковый номер и проверить, является ли он последним, изнутри закрытия. Неподтвержденный пример:
let latestRequestId = 0;
let checkLatest = ()=> {
let thisRequest = ++latestRequestId;
return (res=>{
// Checking whether this is the latest request handler
if (latestRequestId === thisRequest) {
updateData(res)
}
})
}
let latestRequest = MyLib
.retrieve(getFilteredQuery(filters, queries, user))
.then(checkLatest())
.catch(err => {
console.error(err)
})
latestRequest
там
Вы можете просто использовать Promise.all
. Запустите все ваши просьбы и соберите свои обещания. Заполните их в массиве в правильном порядке и подайте их в Promise.all
. Как только обещание от Promise.all
решит, вы обязательно убедитесь, что 1) все они получили ответ, 2) последний из них будет одним из них, и 3) последний запрос ответа - последний элемент разрешенного массива.
Вышеприведенное предполагает, что запросы выходят параллельно, и вы просто хотите последний. Для последовательного подхода вам понадобится какой-то механизм очередей.
new Promise()
или.then()
создает новое обещание. Это не просто обещание в цепочке. Код, который вы показываете, имеет несколько активных обещаний.latestPromise
. Пожалуйста, покажите полный код, который создает несколько обещаний.