4

Я изучал много многопоточность, обратный вызов, диспетчерскую очередь, синхронно и асинхронно ... Чем больше я занимаюсь, тем больше я получал смущен и расстроен до такой степени, что я чувствую, что не могу кажется, понимают это когда-либо .. пожалуйста, кто-то может привести меня к правильному направлению, чтобы начать. Большая часть информации, которую я нашел до сих пор, была связана с тем, что есть и что с ней связано. Что я действительно хочу знать, так это то, как функция возвращает сразу когда асинхронный с обратным вызовом и одним поточным. [здесь] s (http://nathansjslessons.appspot.com/lesson?id=1085), что я получил эту информацию откак асинхронно работает под капотом ..?

The function **returns immediately** before the file is read and schedules the read to happen  
sometime in the future. Once the data is ready, the callback function is called on the  
data. 

Вот пример того, как вы будете использовать обычный блокировка чтения функцию, чтобы получить содержимое файла вар ReadFile = функция () {

var data; 
data = read('file.txt'); 
dosomething('contect' + data); 
} 

Вот тот же пример, использующий функцию асинхронного readAsync.

var readFileAsynch = function() { 
    var func = function (x) { 
      // i can do something with data 
     dosomthing('content'+data); 
    } 
    **readAsynch('file.txt',func);** 
     dosomemorestuff(); 
    }; 

от того, что я знаю, если вы используете другой поток, чем основной поток, чем я думал, что это способ сделать асинхронный, то если у вас есть только одна нить как JavaScript, то как бы Асинхронный действительно работать ..?

И, когда дело доходит до диспетчерских очередей в объективе c, правильно ли думать, что очередь - это просто массив указателей на блоки или функции, и поток отвечает за управление этой очередью в приложении ..?

Мне очень жаль, что мой вопрос очень размыт, но я тоже ... надеюсь, что кто-нибудь может предоставить какой-то исходный код или реализацию, которые я могу прочитать, чтобы понять, что происходит на самом деле. Я устал от того, что просто читаю какую-то вещь, как «использование потока очень дорого» ... но каким образом ..? Или, я не должен знать об этом ..?

Редактировать: так как readAsynch ('file.txt', func); действуют иначе, чем другие функции, так что они называются asynch ..? и как получилось, что он может выполнить dosomemorestuff сразу же, не дожидаясь функции readAsynch прямо выше, если только (я думаю), когда вы вызываете readAsynch, это делается другим потоком ..?

+0

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

+0

@thefourtheye Я не уверен, если я использую несоответствующее слово. что я подразумевал при реализации, было то, что если есть функция, которая действует как асинхронная, поэтому я могу просто вызвать ее, не дожидаясь ее, выполняет следующие утверждения.так как такая функция реализует асинхронное поведение ..? –

ответ

2

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

Вам не придется беспокоиться о потоках и все такое, но если вы делаете, имейте это в виде:

JavaScript не является «Резьбовым» язык, он работает с потоком цикла обработки событий, в который запускается, и после этого запускаются последовательные функции, пока больше не нужно звонить. Именно по этой причине довольно сложно заблокировать пользовательский интерфейс в JavaScript, если вы пишете «хороший» код.

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

Хороший пример того, как это работает, и diferences betwen петель событий и классической резьбе, является Node.js, я дам вам пример:

Supose вы слушаете для запроса на сервере , и через 2 секунды после поступления запроса вы отправите сообщение. Теперь давайте предположим, что вы дублируете этого слушателя, и оба слушателя делают то же самое. Если вы запросите сервер, вы получите два сообщения одновременно, через 2 секунды после запроса, вместо одного сообщения за 2 секунды, а другое - через 4 секунды. Это означает, что оба слушателя одновременно запускаются, а не следуют линейному исполнению, как это делают большинство систем.

Async означает: вы сообщаете какой-либо сервис (DOM, сервер и т. Д.) Для выполнения действия, и вы присоединяете обработчик событий, который будет выполняться после того, как служба сообщит вам, у меня есть то, что вы хотите, или i «Сделал то, что тебе нужно. И этот обработчик выполняется, как любой другой mouseclick или keypress выполняется. Цепочка обработчиков событий может быть PAINFULL, но я верю, что это waaay лучше, чем блокирование пользовательского интерфейса.

Надеюсь, вы найдете это полезным, а не более запутанным.

+0

В вашем ответе (Async означает: вы указываете какую-либо услугу (DOM, сервер и т. Д.) Для выполнения действия, и вы присоединяете обработчик событий, который будет выполняться после того, как служба сообщит вам ---------- ---), когда я скажу какую-то услугу, я предполагаю, что я вызываю некоторую функцию, которая сообщает этим службам, после того, как я вызову эту функцию, не нужно ждать, пока это закончится или получится. Если это не сделано другой нитью ..? –

+0

Это зависит от реализации, как это точно сделано, но вы не должны беспокоиться о том, какой поток запускает это, и если это работает другой поток. JavaScript не переименован, он работает с eventflow, я не могу сказать, если он эмулируется потоками. – user3417400

2

В довольно нескольких асинхронных средах у вас есть только один поток, который работает на вещи. Назовем этот материал «передним планом». Материал, который обрабатывается, запланирован каким-то планировщиком. Очередь указателей функций, вероятно, формирует кишки этого планировщика. Указатели функций почти такие же, как и обратные вызовы.

Когда передняя часть хочет сделать что-то отнимающее много времени, например. запрашивать базу данных или читать файл, затем передняя часть делает запрос к базовой ОС или библиотеке и оставляет вызов, который будет вызван, когда это будет длительное время. (Эта обработка продолжается в другом потоке, возможно, в другом процессе или в ядре, которое так асинхронно). У запроса есть определенный идентификатор, связанный с ним, так что когда задача выполняется, правильный обратный вызов получает вызывается с правильными результатами.

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

+0

Надеюсь, это поможет. – Chrisky

1

Этот ответ может немного запоздать, но я также задался вопросом, как может быть реализована функция async (в Node.js) и как функция async сможет вернуться сразу до выполнения выполненного обратного вызова.

Я нашел this page about the Event Loop and process.nextTick(), чтобы понять, как это работает в Node.js.

Этот пример взят оттуда:

let bar; 

function someAsyncApiCall(callback) { 
    process.nextTick(callback); 
} 

someAsyncApiCall(() => { 
    console.log('bar', bar); // 1 
}); 

bar = 1; 

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

Вот еще один пример мной:

// defining an asynchronous function 
var async_function = function(callback){ 
    console.log("Executing code inside the async function"); 
    process.nextTick(function(){ 
     console.log("Executing code in callback provided to process.nextTick() inside async function"); 

     const startCallback = Date.now(); 
     while (Date.now() - startCallback < 2000) { 
     // do nothing 
     } 
     callback(); 
    }); 
}; 

console.log("Code executed prior to calling the async function"); 
// calling the async function 
async_function(function() { 
    console.log("Executing the callback function provided to async function"); 
}); 
console.log("Code executed after calling the async function"); 

// Output: 

// Code executed prior to calling the async function 
// Executing code inside the async function 
// Code executed after calling the async function 
// Executing code in callback provided to process.nextTick() inside async function 
// (pause of 2 seconds) 
// Executing the callback function provided to async function 
Смежные вопросы