2015-10-07 5 views
0

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

Как assigement я должен включить следующую функцию:

var fs = require('fs'); 

function calculateByteSize(){ 
    var totalBytes = 0, 
    i, 
    filenames, 
    stats; 

    filenames = fs.readdirSync("."); 
    for (i = 0; i < filenames.length; i++){ 
     stats = fs.statSync("./" + filenames[i]); 
     totalBytes += stats.size; 
    } 
    console.log(totalBytes); 
} 
calculateByteSize(); 

в его асинхронной версии.

До сих пор я получил:

var fs = require('fs'); 

function calculateByteSize(){ 
    var totalBytes = 0, 
    i, 
    stats; 
    fs.readdir(".", function(err, data){ 
     for (i = 0; i < data.length; i++){ 
      fs.stat("./" + data[i],function(err, stats){ 
       totalBytes += stats.size; 
      }); 
     } 
    }); 
    console.log(totalBytes); 
} 

calculateByteSize(); 

Какого works-- если я печатаю значение «TotalBytes» во время начала цикла, я получаю правильные значения.

Однако оператор console.log печатает значение «0», так как кажется, что оно выполняется до цикла.

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

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

Есть ли способ, чтобы убедиться, что мой оператор печати выполнен после того, как генерируется правильное значение, без использования обещания? (как в: Issue with nested asynchronous function not returning data in time)

+0

вы читали (HTTP [Как вернуть ответ от асинхронного вызова?]: //stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) – Jasen

ответ

1

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

Вот как вы можете войти в общее число байтов только после того, как все они были добавлены и без обещания:

function calculateByteSize(){ 
    var totalBytes = 0, 
     statsCallsCompleted = 0, 
     i, 
     stats; 

    fs.readdir(".", function (err, data) { 
    for (i = 0; i < data.length; i++){ 
     fs.stat("./" + data[i], function (err, stats) { 
     statsCallsCompleted += 1; 
     totalBytes += stats.size; 
     if (statsCallsCompleted === data.length) { 
      console.log('Total Bytes:', totalBytes); 
     } 
     }); 
    } 
    }); 
} 
Смежные вопросы