Как получить ссылку на текущее обещание в рамках then ()

1

В приведенном ниже коде я хотел бы проверить, что обратный вызов выполняется из 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. Я хочу, чтобы данные обновлялись для последнего запроса. Запросы могут занять совсем другое время, и иногда более ранний запрос возвращается позже и перезаписывает последний запрос. Если вы знаете хороший способ справиться с этим, сообщите мне.

  • 0
    Я бы предложил просто назначить счетчик каждому запросу (где-то в области действия запроса) и отслеживать самый высокий счетчик, по которому вы получили результаты, и тогда вы можете игнорировать любые более старые запросы (более низкие значения счетчика), которые поступают поздно. Это также кажется гораздо более пуленепробиваемым, чем попытка сравнить обещания. Помните, что цепочка обещаний состоит из нескольких обещаний, так как каждый вызов new Promise() или .then() создает новое обещание. Это не просто обещание в цепочке. Код, который вы показываете, имеет несколько активных обещаний.
  • 1
    В вашем коде только одна latestPromise . Пожалуйста, покажите полный код, который создает несколько обещаний.
Показать ещё 2 комментария
Теги:
promise
cancellation

2 ответа

1
Лучший ответ

Нет способа получить ссылку на объект обещания. .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)
  })
  • 0
    У вас есть две переменные latestRequest там
  • 0
    Спасибо @ Bergi, это исправили :)
-1

Вы можете просто использовать Promise.all. Запустите все ваши просьбы и соберите свои обещания. Заполните их в массиве в правильном порядке и подайте их в Promise.all. Как только обещание от Promise.all решит, вы обязательно убедитесь, что 1) все они получили ответ, 2) последний из них будет одним из них, и 3) последний запрос ответа - последний элемент разрешенного массива.

Вышеприведенное предполагает, что запросы выходят параллельно, и вы просто хотите последний. Для последовательного подхода вам понадобится какой-то механизм очередей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню