di node.js, cara menggunakan janji bluebird dengan for-loop

Saya menggunakan bluebird untuk membuat kode js saya sinkron. Saat berada dalam for-loop, saya tidak tahu sintaks untuk menyinkronkannya.

for (i=0; i < rows.length; ++i) {
    var writeBuffer = new Buffer(JSON.stringify(rows[i]))
    fs.appendFileAsync(filename, i + '');
}
fs.appendFileAsync(filename, 'end');

Saya tidak tahu bagaimana memastikan bahwa setiap appendFileAsync berlangsung secara berurutan, dan memastikan untuk menambahkan 'end' setelah for-loop. Adakah yang bisa membantu saya?


person Kingston Chan    schedule 28.06.2015    source sumber
comment
Mengapa Anda membuat writeBuffer? Anda sepertinya tidak menggunakannya sama sekali. Apakah Anda bermaksud menuliskannya ke file?   -  person jfriend00    schedule 28.06.2015


Jawaban (2)


Coba ini:

rows.reduce(function(previous, item){
  return previous.then(function(){
    return fs.appendFileAsync(filename, item + '\n');
  });
}, Promise.resolve())
.then(function(){
  fs.appendFileAsync(filename, 'end');
});

Referensi: https://stackoverflow.com/a/17764496/1807881

Idenya adalah untuk merangkai janji-janji untuk setiap item dalam array sehingga mereka dieksekusi secara berurutan. Dengan reduce Anda dapat mengambil janji sebelumnya dan menghubungkannya dengan item berikutnya dalam array menggunakan then.

person hassansin    schedule 28.06.2015
comment
Anda dapat menghindari rows.shift() (dan membuat skrip berfungsi dengan array kosong juga) dengan memulai akumulator dengan Promise.resolve() alih-alih panggilan first itu - person Bergi; 29.06.2015
comment
Terima kasih! suka solusi ini. - person Kingston Chan; 30.06.2015

Anda dapat menggunakan pengurangan array, tetapi untuk situasi ini Anda mungkin tidak ingin menggabungkan data Anda sebelum melakukan panggilan fs.

Dengan pengurangan array:

  var Promise = require('bluebird');
  var fs = Promise.promisifyAll(require('fs'));

  rows.map(function(row) {
    return new Buffer(JSON.stringify(row));
  }).concat(['end'])
    .reduce(function(a, b) {
      return a.then(function() {
          return fs.appendFileAsync(filename, b);
        })
    }, Promise.resolve(''))
    .then(function(res) {
      // all done here
    })
    .catch(function(err) {
      throw err;
    });

Menurut pendapat saya, yang berikut ini akan baik-baik saja

  var data = rows.map(function(row) {
    return JSON.stringify(row);
  })
  .concat(['end'])
  .join('');

  fs.appendFileAsync(filename, data).then(function(res) {

  });

Begitu Anda membuat janji, janji itu akan dijalankan. Pengurangan array adalah cara yang baik untuk memastikan eksekusi berurutan. Anda pada dasarnya sedang membangun rantai janji. Dalam situasi Anda, ini akan berhasil, tetapi apakah ini keputusan terbaik? Itu akan menjadi panggilan fs untuk setiap baris dan menambah kompleksitas operasi.

person undefined    schedule 28.06.2015