Js - однопоточная.
Браузер можно разделить на три части:
1) Event Loop
2 ) Web API
3) Очередь событий
Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.
Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)
Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.
Таким образом, решение этой проблемы callback или обещают .
A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.
function doAjax(callbackFunc, method, url) { var xmlHttpReq = new XMLHttpRequest(); xmlHttpReq.open(method, url); xmlHttpReq.onreadystatechange = function() { if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) { callbackFunc(xmlHttpReq.responseText); } } xmlHttpReq.send(null); }
В моем коде он называется
function loadMyJson(categoryValue){ if(categoryValue==="veg") doAjax(print,"GET","http://localhost:3004/vegetables"); else if(categoryValue==="fruits") doAjax(print,"GET","http://localhost:3004/fruits"); else console.log("Data not found"); }
Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856
Иногда, когда в процессе dev есть обе рабочие станции WIN и системы LINUX (хостинг), а в коде вы не видите никакого вывода перед соответствующей строкой, это может быть форматирование файла и отсутствие Unix LF (linefeed) заканчивается.
Что мы обычно делаем, чтобы быстро исправить это, переименуйте файл, а в системе LINUX создайте новый файл вместо переименованного, а затем скопируйте его в него. Во многих случаях это решает проблему, так как некоторые из файлов, которые были созданы в WIN, когда-то перемещенные на хостинг, вызывают эту проблему.
Это исправление - это легкое исправление для сайтов, которыми мы управляем по FTP, и иногда может спасти наш новый членов команды некоторое время.
Обычно эта ошибка возникает, когда мы отправляем заголовок после эха или печати. Если эта ошибка возникает на определенной странице, убедитесь, что страница не выполняет эхо-сигналы перед вызовом start_session()
.
Пример непредсказуемой ошибки:
<?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();
//your page content
Еще один пример:
<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();
//your page content
Вывод: не выводить символ перед тем, как вызывать функции session_start()
или header()
, даже не с помощью пробела или новой строки
(скопировано из: source )
================= ===
1) перед командой header(.......);
не должно быть никакого выхода (т. е. echo..
или HTML-коды].
2) удалить любое пробел (или newline) до <?php
и после ?>
тегов.
3) ЗОЛОТОЕ ПРАВИЛО! - проверьте, поддерживает ли этот файл php (а также, если вы include
другие файлы) UTF8 без кодировки спецификации (а не только UTF-8). Это проблема во многих случаях (потому что кодированный файл UTF8 имеет что-то особенное в начале файла php, которое ваш текстовый редактор не показывает) !!!!!!!!!!!
4) После header(...);
вы должны использовать exit;
5) всегда используйте ссылку 301 или 302:
header("location: http://example.com", true, 301 ); exit;
6) Включить ошибку составление отчетов. И сообщите об ошибке.
7) Если ни одно из вышеизложенных не помогает, используйте перенаправление JAVSCRIPT (однако, сильно не рекомендованный метод), может быть последним шансом в пользовательских случаях ...:
echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
Другая неудачная практика может вызвать эту проблему, которая еще не указана.
См. этот фрагмент кода:
<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>
Все в порядке, верно?
Что делать, если «a_important_file.php»:
<?php
//some php code
//another line of php code
//no line above is generating any output
?>
----------This is the end of the an_important_file-------------------
Это не сработает? Почему? Потому что уже создана новая строка.
Теперь, хотя это не общий сценарий, что, если вы используете структуру MVC, которая загружает большое количество файлов перед передачей данных на ваш контроллер? Это не необычный сценарий. Будьте готовы к этому.
Из PSR-2 2.2:
Unix LF (linefeed) line ending
. single blank line
. omitted
из файлов, содержащих only php
Поверьте, следующие стандарты могут сэкономить вам много часов из вашей жизни:)
Это сообщение об ошибке запускается, когда отправляется сообщение перед отправкой заголовков HTTP (с помощью setcookie
или header
). Общие причины вывода чего-либо перед заголовками HTTP:
<?php
// Note the space before "<?php"
?>
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Чтобы избежать этого, просто оставьте закрытие ?>
- это не обязательно. g2] в начале файла php. Изучите ваши php-файлы с помощью шестнадцатеричного редактора, чтобы узнать, так ли это. Они должны начинаться с байтов 3F 3C
. Вы можете безопасно удалить спецификацию EF BB BF
с начала файлов.
echo
, printf
, readfile
, passthru
, код до <?
и т. д. display_errors
php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors
или error_reporting , вы должны скорее исправить эту проблему. Основными причинами являются доступ к неопределенным элементам массива (например, $_POST['input']
без использования empty
или isset
, чтобы проверить, установлен ли вход) или используя неопределенная константа вместо строкового литерала (как в $_POST[input]
, обратите внимание на недостающие кавычки). Включение буферизации вывода должно устранить проблему; все выходные данные после вызова ob_start
буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush
.
Однако, хотя буферизация вывода исключает проблемы, вы должны действительно определить, почему ваше приложение выводит тело HTTP перед заголовком HTTP. Это будет похоже на телефонный звонок и обсуждение вашего дня и погоды, прежде чем сообщить вызывающему, что у него неправильный номер.
Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым тегом <?php
, может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.
Я видел эти вещи;)
Это из-за этой строки:
printf ("Hi %s,</br />", $name);
Вы не должны печатать / эхо ничего, прежде чем отправлять заголовки.
Вы делаете
printf ("Hi %s,</br />", $name);
перед установкой файлов cookie, что запрещено. Вы не можете отправить какой-либо вывод перед заголовками, даже пустую строку.
Я получил эту ошибку много раз раньше. И я уверен, что все программисты PHP по крайней мере однажды получили эту ошибку. Чтобы решить эту ошибку, вы можете решить использовать решение по вашему уровню проблемы:
Возможное решение 1:
Возможно, вы оставили пробелы до или после (в конце файла после?>) ie
THERE SHOULD BE NO BLANK SPACES HERE
<?php
echo "your code here";
?>
DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.
В большинстве случаев это должно решить вашу проблему. Проверьте все файлы, связанные с файлом require
.
Примечание: Иногда EDITOR (IDE), например gedit (редактор linux по умолчанию), добавляет одну пустую строку в файл save save. Этого не должно быть. Если вы используете linux. вы можете использовать редактор VI для удаления пробела / строк после?> в конце страницы.
Если это не ваш случай, тогда вы можете использовать ob_start для буферизации вывода, как показано ниже:
Возможное решение 2:
<?php
ob_start();
// code
ob_end_flush();
?>
Это приведет к буферизации вывода и ваши заголовки будут созданы после буферизации страницы.
Вместо нижней строки
//header("Location:".ADMIN_URL."/index.php");
напишите
echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");
или
?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php
Это определенно решит вашу проблему. Я столкнулся с одной и той же проблемой, но решил решить эту проблему путем написания заголовка.