Facebook разбирает изображение со второй попытки [дубликат]

Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)

Модель цикла события и параллелизма

Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек

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

while (queue.waitForMessage()) {
   queue.processNextMessage();
}

Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:

 1. call foo.com/api/bar using foobarFunc
 2. Go perform an infinite loop
 ... and so on

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

function foobarFunc (var) {
  console.log(anotherFunction(var));
}

. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)

. Главное здесь - порядок выполнения. Это

КОГДА что-то будет запущено

Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.

Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, ​​и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.

Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done deffered.fail и deffered.always (среди других). Вы можете увидеть их все здесь

Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.

Поскольку обратный вызов не выполняется немедленно, но в более позднее время важно передать ссылку на функцию, которую она не выполнила. поэтому

function foo(bla) {
  console.log(bla)
}

, поэтому большую часть времени (но не всегда) вы пройдете foo не foo()

. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.

22
задан Mr_Green 11 February 2015 в 07:06
поделиться

4 ответа

UPDATE

Это решение с iframe больше не работает! Работает с вчера 06 февраля 2017 года. Facebook просто установил X-Frame-Options как DENY, чтобы вы не могли загрузить URL-адрес чата в iFrame. Я выясняю другое обходное решение.


К сожалению, добавление og: image: width и og: image: height не работает для меня.

Я нашел обходное решение для эта ошибка в facebook, которая сработала: я добавил скрытый iFrame со ссылкой для разделителя в нижнем колонтитуле страницы; таким образом, сканер facebook проверяет страницу один раз.

Пример скрытого iFrame:

<iframe style="width: 0px; height: 0px; margin: 0px; padding: 0px;" src="https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fwww.example.com"></iframe>
0
ответ дан Dan 26 August 2018 в 10:01
поделиться
  1. Go здесь
  2. Введите URL вашего видео YouTube
  3. Нажмите «Получить новую информацию о царапинах»
  4. Вернуться назад в Facebook
  5. Перезагрузите страницу
  6. Введите URL снова

И он должен работать нормально

0
ответ дан DJK 26 August 2018 в 10:01
поделиться

В соответствии с этой ошибкой в блоге отслеживания ошибок в Facebook:

Это по дизайну, мы не гарантируем, что правильное изображение будет снято сразу, когда вы ссылка для улучшения производительности.

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

С следующей недели (11/11) вы также можете сразу же получить правильное изображение, описав изображение с помощью og:image. Для этого необходимо определить ширину и высоту.

9
ответ дан Mr_Green 26 August 2018 в 10:01
поделиться

Причина в том, что FB за кулисами все еще очищает вашу страницу и кэширует изображение. В следующий раз, на самом деле, у вас есть и изображение. Как его решить? Ручное предварительное кэширование: https://developers.facebook.com/docs/sharing/best-practices#precaching

или просто добавить

<meta property="og:image:width" content="450"/>
<meta property="og:image:height" content="298"/>
30
ответ дан rogerdpack 26 August 2018 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: