Async: Β«ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²Β» с использованиСм async.forEachLimit

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 26 Π΄Π΅ΠΊ. 2011  Β·  15ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: caolan/async

async = require('async');

var documents = ['a', 'b', 'c', 'd', 'e', 'f'];

async.forEachLimit(documents, 2, function(item, callback) {
  console.log(".", item);
  callback(null);
}, function(err){
  console.log("end", err);
});

Π–ΡƒΡ€Π½Π°Π»

$ node test.js
. a
. a
. a
. a
. a
. a
end undefined
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
. b
[...]

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
RangeError: Maximum call stack size exceeded

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― выполнял ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ синхронизации. Π― исправил это, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² с:

callback();

ΠΊ

setTimeout(callback, 0);

ВсС 15 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

forEachLimit выглядит Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

started += 1 running += 1

слСдуСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. arr[started] Ρ‚Π°ΠΊΠΆΠ΅ слСдуСт Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° arr[started - 1]

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с этой ошибкой Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° iterator Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ‚Π°ΠΊΡ‚Π΅.

ΠŸΠ Π•ΠšΠ ΠΠ’Π˜Π’Π¬ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ SYNC Π² async.js

Π― столкнулся с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° Ρƒ мСня Π±Ρ‹Π»ΠΎ условноС return callback(null); Π² ΠΌΠΎΠ΅ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡƒΠΌΠ½ΡƒΡŽ Π²Π΅Ρ‰ΡŒ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ массив с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Array.filter ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ async.forEach , Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ...

Если Π²Ρ‹ _Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ_ считаСтС, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ process.nextTick(function() { callback(); }) .

@jacobrask Π­Ρ‚ΠΎ сработало Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Бпасибо

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ callback(null); синхронно. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ асинхронно, аля process.nextTick(callback) ΠΈΠ»ΠΈ process.nextTick(function() { callback(null); }); . Как сказал @bobrik , ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ синхронизации Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ :)

Π‘ΠΊΠ°Π·Π°Ρ‚ΡŒ Β«ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ синхронизации Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅Β» Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ смысла β€” ΠΎΠ½ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² forEachLimit это каТСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.

async.forEachLimit(['a','b'], 1, function(item, callback){
  if(something) {
    doStuff(function(){ callback(); });
  } else {
    callback();
  }
});

Π₯отя я ΠΌΠΎΠ³Ρƒ довольно Π»Π΅Π³ΠΊΠΎ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этого ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° (ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ @jacobrask с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ), Ρ‡Ρ‚ΠΎ, Ссли doStuff() (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π²Π½Π΅ ΠΌΠΎΠ΅Π³ΠΎ контроля) Ρ€Π΅ΡˆΠΈΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠΎΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π±Π΅Π· process.nextTick()?

Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π²Ρ‹Π·ΠΎΠ²Π° async.nextTick, Ссли ΠΎΠ½ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ синхронный ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² этих случаях Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ пСрСполнСния стСка. А Ссли ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ, ΠŸΠ Π•ΠšΠ ΠΠ’Π˜Π’Π• Π’Π«Π—ΠžΠ’ΠΠ’Π¬ ЀУНКЦИИ БИНΠ₯Π ΠžΠΠ˜Π—ΠΠ¦Π˜Π˜ Π’ ASYNC! ... вмСсто этого сдСлайтС свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ синхронными ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ асинхронными;)

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ для мСня с async.eachSeries .

Π’Π°ΠΊΠΆΠ΅ происходит Π² mapLimit , ΠΈ Π΄Π°, моя функция синхронизируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это фиктивная функция. Π—Π°Ρ‚Π΅ΠΌ я ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽ Π΅Π³ΠΎ Π² setImmediate , ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ΅Π½Π°.

Π‘Π»ΡƒΡ‡ΠΈΡΡŒ со ΠΌΠ½ΠΎΠΉ Π½Π° async.forEachOfLimit

Бтолкнулся с Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ с async.waterfall .

async.queue Ρ‚ΠΎΠΆΠ΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ.

Π― выполнял ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ синхронизации. Π― исправил это, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² с:

callback();

ΠΊ

setTimeout(callback, 0);

Π­Ρ‚ΠΎ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ со ΠΌΠ½ΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΊ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΡŽ Π±Ρ‹Π» привязан ΡƒΠ»ΠΎΠ². Π§Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ°:
async.forEach(items, (item:any, callback:Function) => { someAsyncPromise(item).then(() => { callback(); }).catch((err) => { //console error or something here callback(); }) });

catch Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΠ΅Ρ€Π΅Π΄ асинхронным Π±ΠΈΡ‚ΠΎΠΌ Π² ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ эта ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

`

Π― понимаю, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ синхронизации Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Но Ссли Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ синхронизации callback() Π²Π½ΡƒΡ‚Ρ€ΠΈ асинхронного Ρ‚Π΅Π»Π° Π½Π΅Π²Π΅Ρ€Π΅Π½, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ докумСнтация ΠΏΠΎ асинхронности ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ это Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…?

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠ½Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с асинхронным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ?

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ нСпосрСдствСнно ΠΈΠ· асинхронной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

// assuming openFiles is an array of file names
async.each(openFiles, function(file, callback) {

    // Perform operation on file here.
    console.log('Processing file ' + file);

    if( file.length > 32 ) {
      console.log('This file name is too long');
      callback('File name too long');
    } else {
      // Do work to process file here
      console.log('File processed');
      callback();
    }
}, function(err) {
    // if any of the file processing produced an error, err would equal that error
    if( err ) {
      // One of the iterations produced an error.
      // All processing will now stop.
      console.log('A file failed to process');
    } else {
      console.log('All files have been processed successfully');
    }
});

https://caolan.github.io/async/docs.html#each

Бпасибо!

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

PsyTae picture PsyTae  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

brainthinks picture brainthinks  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Saevon picture Saevon  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

alfredoborrero picture alfredoborrero  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

ashoksahoo picture ashoksahoo  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ