此循环代码仅在第一次运行。请告诉我如何纠正它。我需要函数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;
答案 0 :(得分:1)
尝试使用results.map()
函数返回每个结果的承诺,而不是使用循环。
现在你试图从同样的功能中多次返回这是不可能的 - 好吧,它对发电机来说有点可能,但它不一样。
如果你有一个函数需要result
中的一个元素并且返回一个承诺,那么你将能够使用results.map()
,然后使用Promise.all()
来等待所有承诺。
您的代码存在太多问题,只能指向一个修复程序。您可能需要从头开始编写它。你应该记住的是你不能在同一个函数中多次使用return
因为第一次返回将从函数返回,并且函数将不会运行任何其他函数。 return语句甚至终止了生成器。