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

在这个代码循环运行只有第一次。 请告诉我如何纠正它。 我需要函数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 ie i=0 }); return deferred.promise; } } response().then(function(){ console.log(friend_requests); res.send(friend_requests); }) 

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

现在你正在试图从相同的函数中返回很多次,这是不可能的 – 对发生器来说,这是可能的,但它不一样。

如果你有一个函数接受result一个元素,并返回一个promise,那么你可以使用results.map() ,然后使用Promise.all()来等待所有的promise。

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