2016-03-23 16 views
0

Geçici bir yöntem olarak, programımın belirli değişkenlerini depolamak için bir .txt dosyası kullanıyorum. Yazma fs.appendFile ile mükemmel gider, ancak boyutu verilen, fs.readFile ile okuma uygun değil - dosyadan belirli bir satır almak istiyorum ve npm line-by-line bana yardımcı olabilir söylendi. Bununla birlikte, bununla birlikte biraz kaybolmuş durumdayım. Bu dediğim bir işlevdir:Tüm satırlarda "line-by-line" olarak nasıl yinelenir?

function YTAPP_LBL_SetValueToLine(path, lineid, value){ 

    var lr = new lblreader(path); 
    var m = 0; 

    lr.on('line', function (line) { 
     // 'line' contains the current line without the trailing newline character. 
     m=+1; 
     if(m==lineid){ value = line; }; 
    }); 

}; 

Ve kendisi tüm giriş değişkeni mutlaka uygun olmak üzere bir olağan işlev çağrısı olarak gerçekleşir diyoruz.

Bunun uygun bir yöntem olmadığını düşünmeliydim, ancak belgeler, bu eşzamanlı yöntemidir. Ancak, .on'un çalışmasının ihtiyaç duyduğu işlev girdisi nedeniyle asiks olduğunu görebiliyorum.

Sorunla ilgili bir sorun olup olmadığından emin değilsiniz, ancak işlev çağrısından sonra console.log, her zaman değişkenin değiştirilmediğini gösterir.

Bunu nasıl yapabilirim?

+0

Sorunuzu anladığımdan emin değilim, ancak bu senkronizasyonu nasıl yapacağınızı soruyorsanız [imkansız] (http://stackoverflow.com/q/14220321/1048572?how-to-return-the-response- dan-bir-asenkron çağrı). – Bergi

cevap

1

Çekirdek Düğüm API'sı tarafından sağlanan Readline modülünü kullanabilirsiniz.

Readline Örnek API hat-by-Line

const readline = require('readline'); 
const fs = require('fs'); 

const rl = readline.createInterface({ 
    input: fs.createReadStream('sample.txt') 
}); 

rl.on('line', (line) => { 
    console.log('Line from file:', line); 
}); 

videoid değeri geçirildi için değişken değişmedi Node Readline API Docs

+0

İlk başta korktum, çünkü ilk varsayımım 'rl.on' çağrısının karmaşık bir asnyc yoluna ihtiyaç duymasıydı - 'line-by-line' aynı şeyi gördüğümde bunu düşünmeliydim ama her neyse, sormak zorundayım: ** async çağrısı gerektiriyor mu? ** 'rl.on'unu kurduktan sonra kodun yürütülmesi ile devam ediyor mu, yoksa“ kapalı ”olana kadar bekler mi? –

+0

Evet, bu, 'rl.on()' dinlenmeye ayarlandıktan sonra kodunuzu engellemez. Esas olarak async geri çağırma eşdeğeri olan "close" olayı vardır. Daha fazla kontrol akışına ihtiyacınız varsa, bunu “bluebird” veya “async” gibi sarmak için başka bir kütüphane uygulamanız gerekir. – peteb

+0

Ah, harika ... Daha iyi bir NodeJS uygulamasının, geri çağırma ** durumlarının geri bildirimi içinde bu ** geri çağrıyla dolu olduğunu düşünüyorum. –

1

alınmıştır Yukarıdaki örnek için . Bu, işlev içindeki herhangi bir değişikliğin, değişkenin kendisine yansıtılmadığı anlamına gelir. Örneğin

:

function increment(num) { 
    num++; 
} 
var a = 1; 
increment(a); 
console.log(a); // 1 

işlevi tarafından değiştirilebilir olacak bir değişkene aktarmak için, bir nesne türü geçmek gerekir. Okuduğunuz bitince

function increment(num) { 
    num.val++; 
} 
var a = {val: 1}; 
increment(a); 
console.log(a); // Object {val: 2} 

programınıza bu uygulamak için videoid tutmak için bir nesne gibi yakın bir akış oluşturmak gerekir: Örneğin:

var videodata = {videoid: 'someID'}; 
function YTAPP_LBL_SetValueToLine(path, lineid, viddata){ 

    var lr = new lblreader(path); 
    var m = 0; 

    lr.on('line', function (line) { 
    // 'line' contains the current line without the trailing newline character. 
    m += 1; 
    if(m == lineid){ 
     viddata.videoid = line; 

     // Close the stream 
     lr.close(); 
    } 
    }); 



}; 
+0

Vay, bekle ... 'a' a.val 'yerine parametre olarak eklemek yeterlidir? –

İlgili konular