2016-03-16 5 views
0

Я новичок в nodeJs, и я получаю борется с асинхронными вызовами.Как написать синхронную функцию в nodejs

в этом нижеприведенном коде есть массив источников, например (1,2,3 ..). каждый канал может содержать несколько изображений, и теперь я хочу удалить изображения из папки и из базы данных.

то, что я сделал это

for(var i=0; i<feedArr.length; i++){ 
    var feedId = feedArr[i].feedid; 
    var listFeedImageQuery = "select imageUrl from feedImages where feedId='"+feedId+"'"; 
    var deleteFeedImagesQuery = "delete from feedImages where feedId='"+feedId+"'"; 
    model.client.query(listFeedImageQuery,function(err,result){ 
     if(result.rows.length > 0){ 
      for(var j=0; j<result.rows.length; j++){ 
       fs.unlink(result.rows[j].imageurl, function(err) { 
        if(err) 
         console.log(err); 
       }); 
      } 
      model.client.query(deleteFeedImagesQuery,function(err,result){ 
       if(err) 
        console.log(err) 
       else 
        console.log(feedId +' were removed'); // last feedId only gets removing from database 
      }); 
     } 
    }); 
} 

здесь я могу иметь возможность удалить изображения из папки для хранения изображений, но я не смог удалить записи из базы данных, только последняя запись кормы становится удалена. остальные записи feedImage находятся в базе данных.

и я исследовал что-то об асинхронном модуле, но я не знаю, как адаптировать эту проблему к этому.

плз помощь по этому вопросу, спасибо за указатели

+0

Вы знаете, что он имеет циклическую обработку одним потоком, не так ли? Почему бы вам не написать синхронную функцию. –

+0

да, я знаю это, но в какой-то ситуации его разочарование, вы знаете, как это решить. – karthik

+0

Возможный дубликат [Наилучший шаблон для обработки асинхронного цикла в Node.js] (http://stackoverflow.com/questions/8579557/the-best-pattern-for-handling-async-looping-in-node-js) – Seth

ответ

1

это общая проблема при переключении на обратный вызов базы от «стандартного» один.

Вот как это работает, сначала синхронно запустить этот

for(var i=0; i<feedArr.length; i++){ 
    var feedId = feedArr[i].feedid; 
    var listFeedImageQuery = "select imageUrl from feedImages where feedId='"+feedId+"'"; 
    var deleteFeedImagesQuery = "delete from feedImages where feedId='"+feedId+"'"; 
    model.client.query(listFeedImageQuery,function(err,result){ 
     //to be executed later 
    }); 
} 

Метод model.client.query выталкивается с каждым циклом в «стопке асинхронных вызовов», поэтому в тот момент, когда все эти запросы выполняются , feedId равен feedArr[feedArr.length-1].feedid

Одним простым способом является обернуть его вокруг методов с параметром и сразу же вызвать их.

for(var i=0; i<feedArr.length; i++){   
    (function(feedId) { 
     var listFeedImageQuery = "select imageUrl from feedImages where feedId='"+feedId+"'"; 
     var deleteFeedImagesQuery = "delete from feedImages where feedId='"+feedId+"'"; 
     model.client.query(listFeedImageQuery,function(err,result){ 
      //to be executed later 
     }); 
    })(feedArr[i].feedid); 
} 

Теперь это должно сработать.

+0

Большое спасибо – karthik

1
for (var i = 0; i < 10; i++) { 
    console.log('sync', i); 
    setTimeout(function() { 
    console.log('wrong async', i) 
    }, 1); 
} 


for (var i = 0; i < 10; i++) { 
    setTimeout((function (j) { 
    console.log('right async', i) 
    })(i), 1); 
} 

enter image description here

Рисунок его, может быть, вы будете знать, где вы были неправы.


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

function deleteImages(feedId) { 
    var listFeedImageQuery = "select imageUrl from feedImages where feedId='"+feedId+"'"; 
    var deleteFeedImagesQuery = "delete from feedImages where feedId='"+feedId+"'"; 
    model.client.query(listFeedImageQuery,function(err,result){ 
     if(result.rows.length > 0){ 
      for(var j=0; j<result.rows.length; j++){ 
       fs.unlink(result.rows[j].imageurl, function(err) { 
        if(err) 
         console.log(err); 
       }); 
      } 
      model.client.query(deleteFeedImagesQuery,function(err,result){ 
       if(err) 
        console.log(err) 
       else 
        console.log(feedId +' were removed'); // last feedId only gets removing from database 
      }); 
     } 
    }); 
} 

for(var i=0; i<feedArr.length; i++){ 
    var feedId = feedArr[i].feedid; 
    deleteImages(feedId); 
} 

Для более сложного вопроса, если вы не хотите обратный вызов ад, попробуйте async или bluebird

Смежные вопросы