Решение обещания не вызвано, потому что всплывающее окно закрывается слишком быстро - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующий фрагмент кода:

  browser.windows.create({ url: urls }).then((newWindow) => {
    newWindow.tabs.slice(0, pins.length).map((tab, index) => {
      browser.tabs.update(tab.id, { pinned: true })
    })
  })

Это прекрасно работает, когда я предотвращаю закрытие всплывающего окна (с помощью инструментов webdev), но при обычном использовании разрешение не запускается.

1 Ответ

0 голосов
/ 22 июня 2018

Я боролся с этой же проблемой, когда начал работать над своим аддоном ( В My Pocket for Firefox , вы можете взглянуть на код на bitbucket, если он может помочь ,Я реализую именно то, что я собираюсь объяснить).Мне нужно было инициировать сетевые вызовы API из всплывающего окна и что-то делать, когда запрос был успешным, и у меня возникла та же проблема.

Следует помнить, что код извсплывающее окно выполняется до тех пор, пока оно открыто .Закрытие всплывающего окна похоже на закрытие веб-страницы, содержащей Javascript: весь его JS-код «выгружен», выполнение кода прекращается, обработать обещание больше нечего.

Способ обойти это состоит в реализации действительногоповедение в фоновом скрипте, который всегда будет работать, и обмен данными между фоновым скриптом и всплывающим окном через сообщения с помощью метода runtime.sendMessage и настройки прослушивателя событий с помощью runtime.onMessage.addListener.

Фоновые сценарии - это место для размещения кода, который должен поддерживать долгосрочное состояние или выполнять долгосрочные операции, независимо от времени жизни каких-либо конкретных веб-страниц или окон браузера.

popup and background scrpit message flow illustration

Вы можете полюбить сообщения (обмениваться объектами, а не простой строкой), но вы поняли идею.И таким образом, ваш код, который не разрешается немедленно, все равно будет обрабатываться до тех пор, пока не будет завершен, даже если всплывающее окно закрыто до завершения обработки.

...