javascript - एसिंक कतार, फ़िलेस्ट्रीम एंड कैसे पता कैसे दोनों को समाप्त हो



node.js callback (1)

सबसे पहले, मुझे यकीन नहीं है कि आपका स्निपेट कितना छद्म कोड है लेकिन var q.drain = ... मान्य जावास्क्रिप्ट नहीं है और त्रुटि चाहिए यह सिर्फ q.drain = होना चाहिए क्योंकि आप किसी मौजूदा ऑब्जेक्ट पर एक संपत्ति को परिभाषित नहीं कर रहे हैं, जो कि एक नया वैरिएबल नहीं घोषित करते हैं। हो सकता है कि ऐसा क्यों हो सकता है कि आपका नाली का काम छद्म कोड न होने पर फ़ायरिंग नहीं कर रहा है।

कुछ तरीके हैं जिनसे आपको लगता है कि आप क्या करने की कोशिश कर रहे हैं। एक अपने अंत हैंडलर में कतार की लंबाई की जांच करने के लिए और नाली समारोह को सेट करने के लिए होगा यदि अभी भी प्रक्रिया करने के लिए आइटम हैं

.on('end', function(){
  if(!q.length){
    callDone();
  }
  else {
    q.drain = callDone;
  }
});

function callDone(){
  done(null, responseLines);
}

यह प्रभावी रूप से कह रहा है कि "अगर कतार पर संसाधित किया गया कॉल किया जाता है, यदि नहीं, तो कॉल किया जाता है जब यह है!" मुझे यकीन है कि आपके कोड को साफ करने के लिए बहुत सारे तरीके हैं लेकिन उम्मीद है कि यह आपकी विशिष्ट समस्या का समाधान प्रदान करेगा

मैं एक मामूली मुद्दा ले रहा हूँ जब एक फाइलस्ट्रीम के साथ async.queue का उपयोग कर रहा है

  1. मेरे पास एक ऐसा परिदृश्य है जहां मेरा फिस्ट्रीम समाप्त हो जाएगा
  2. मैंने फाइल सेट की है सच को पढ़ें
  3. हालांकि कतार खाली हो जाएगा और पहले से ही नाली कहा है
  4. यह तब मेरे "किया" की ओर जाता है जिसे कभी भी नहीं कहा जाता है

मेरे filestream "अंत" के बाद "कतार समाप्त" कहने का सही तरीका क्या है और कतार खाली है?

var fs = require('fs')
    , util = require('util')
    , stream = require('stream')
    , es = require('event-stream');

var async = require('async');

var fileRead = false;
var lineNr = 0;

var q = async.queue(function(task, callback) {
    task(function(err, lineData){
        responseLines.push(lineData);
        callback();
      });
  }, 5);

var q.drain = function() {
  if(fileRead){
    done(null, responseLines);
  }
}

var s = fs.createReadStream('very-large-file.csv')
    .pipe(es.split())
    .pipe(es.mapSync(function(line){
        s.pause();
        q.push(async.apply(insertIntoDb, line))
        s.resume();
    })
    .on('error', function(err){
       done(err);
    })
    .on('end', function(){
      fileRead = true;
    })
);

या वहाँ async का एक बेहतर उपयोग है जो मुझे यह करने की अनुमति देगा? यदि लाइनों में से किसी में त्रुटियां हैं तो जल्दी से बाहर निकलने की क्षमता के साथ लाइन के रूप में एसिंक प्रक्रिया लाइन





async.js