2017-03-06 10 views
1

このループのコードでは、初めてのみ実行されます。どのように修正できるか教えてください。ループの次の値の実行を開始する前に関数get_profile_image()を実行する必要があります。このコードforループでは、初めてのみ実行されます。Qライブラリを使ってforループに約束を適用するには?

function response(){ 
 
     var deferred = q.defer(); 
 

 
    for(var i=0; i < results.length; i++){ 
 

 

 
     var from_name = results[i].from_name; 
 
     var request_from = results[i].request_from; 
 

 
     var empty = new Array(); 
 
     friend_requests.push(empty); 
 
     friend_requests[i].push(from_name); 
 
     friend_requests[i].push(request_from); 
 
     var new_array = friend_requests[i]; 
 
     function get_profile_image(){ 
 
     var profile_image_defer = q.defer(); 
 
     var dir = "./public/img/users_directory/"+request_from; 
 
     fs.readdir(dir, function(err, files) { 
 
      files.forEach(function(f) { 
 
       var file = f.substr(0, f.lastIndexOf('.')); 
 

 
       if(file === "profile_image"){ 
 
        profile_image = "../img/users_directory/"+email+ "/" +f; 
 
        new_array.push(profile_image); 
 
       } 
 
      }); 
 
      profile_image_defer.resolve(profile_image); 
 
      }); 
 

 
      return profile_image_defer.promise; 
 

 
     } 
 
     
 
     get_profile_image().then(function(){ 
 
     deferred.resolve(friend_requests); //This runs only for first time i.e. i=0 
 

 
     }); 
 

 
     return deferred.promise; 
 

 
    } 
 

 

 

 

 
    } 
 
    response().then(function(){ 
 
    console.log(friend_requests); 
 
    res.send(friend_requests); 
 
    })

+0

あなたはforループの中に戻ってきています - これは一度だけ実行される理由です –

+0

あなたのコードを表示する代わりにあなたの問題を記述しようとすると、読めなくなり、 – Jaime

答えて

1

代わりにループを使用するのではなく、すべての結果のための約束を返す関数でresults.map()を使用してみてください。

今は不可能な同じ関数から何回も返そうとしています - よく、ジェネレータでは可能ですが同じではありません。

resultの1つの要素を取り、約束を返し、results.map()と一緒に使用してから約束をすべて待つ関数を使用している場合は、Promise.all()を使用します。

1つの修正点を指すだけのコードで問題が多すぎます。おそらく最初から書き込む必要があります。あなたが念頭に置いておきたいことは、最初の戻り値は関数から返って関数は何も実行しないので、同じ関数でreturnを複数回使用できないということです。 return文は偶数ジェネレータも終了します。

関連する問題