如何使用Q库在for循环上应用promise?

时间:2017-03-06 00:13:46

标签: node.js express promise q

此循环代码仅在第一次运行。请告诉我如何纠正它。我需要函数get_profile_image()在它开始执行下一个循环值之前运行。这个循环代码只是第一次运行。



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);
   })
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

尝试使用results.map()函数返回每个结果的承诺,而不是使用循环。

现在你试图从同样的功能中多次返回这是不可能的 - 好吧,它对发电机来说有点可能,但它不一样。

如果你有一个函数需要result中的一个元素并且返回一个承诺,那么你将能够使用results.map(),然后使用Promise.all()来等待所有承诺。

您的代码存在太多问题,只能指向一个修复程序。您可能需要从头开始编写它。你应该记住的是你不能在同一个函数中多次使用return因为第一次返回将从函数返回,并且函数将不会运行任何其他函数。 return语句甚至终止了生成器。