【问题标题】:How to apply promises on a for loop using Q library?如何使用 Q 库在 for 循环上应用 Promise?
【发布时间】:2017-07-25 17:37:54
【问题描述】:

在此代码中,for 循环仅第一次运行。请告诉我如何纠正它。我需要函数 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);
   })

【问题讨论】:

  • 你在 for 循环中返回 - 这就是为什么它只运行一次
  • 如果您尝试描述您的问题而不是显示您的代码会更好,因为在某些方面不可读和错误...

标签: node.js express promise q


【解决方案1】:

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

现在你正试图从相同的函数返回很多次,这是不可能的 - 好吧,这在生成器中是可能的,但不一样。

如果您有一个函数接受 result 的一个元素并返回一个承诺,那么您就可以将它与 results.map() 一起使用,然后使用 Promise.all() 等待所有承诺。

您的代码存在太多问题,无法仅指出一种解决方法。您可能需要从头开始编写它。你应该记住的是,你不能在同一个函数中多次使用return,因为第一次返回会从函数返回,并且函数不会运行其他任何东西。 return 语句甚至终止生成器。

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2016-12-13
    • 2014-10-15
    • 2014-01-28
    • 2015-07-31
    • 2018-07-03
    相关资源
    最近更新 更多