Javascript js控制器等待异步服务方法
我不太习惯nodejs/javascript中的承诺,基本上我希望我的控制器只在我的承诺运行完之后返回一个值 我在我的Sails应用程序中提供以下服务。我正在使用请求承诺模块向facebook graph api发出HTTP请求Javascript js控制器等待异步服务方法,javascript,node.js,recursion,promise,sails.js,Javascript,Node.js,Recursion,Promise,Sails.js,我不太习惯nodejs/javascript中的承诺,基本上我希望我的控制器只在我的承诺运行完之后返回一个值 我在我的Sails应用程序中提供以下服务。我正在使用请求承诺模块向facebook graph api发出HTTP请求 返回http(选项)。然后(函数(数据){ var res=JSON.parse(数据); 如果(!res | | res.error){ console.log(!res?)加载照片时出错:res.error); 返回; } for(资源数据中的var光指数){ v
返回http(选项)。然后(函数(数据){
var res=JSON.parse(数据);
如果(!res | | res.error){
console.log(!res?)加载照片时出错:res.error);
返回;
}
for(资源数据中的var光指数){
var photo=分辨率数据[photoIndex];
如果(照片标签){
for(photo.tags.data中的var tagIndex){
var tag=photo.tags.data[tagIndex];
log('TAG\u ID:'+TAG.ID+'->TARGET\u ID:'+TARGET);
if(tag.id==目标){
照片。推送(照片);
}
}
}
}
if(res.paging&&res.paging.next){
log('recursion in action!!');
我自己(id、目标、accessToken、decodeURIComponent(res.paging.next));
}
当你说这是一份.then()工作时,你是对的
var countPhotos = Facebook.countTaggedPhotos()
您正在将countPhotos设置为countTaggedPhotos()。然后()返回。在这种情况下,它不会返回照片数。您可以访问照片数的唯一位置是在其中。然后
为了进一步帮助您,您需要提供围绕
return http(options).then(function(data){...
因为在这里,您正在引用照片,但我不知道这些照片是如何实际提供给控制器中的.then()的。几个小时后,我的头撞到了墙上,因为这个问题,我找到了问题的根源和解决方案 问题的根源:递归 一旦递归开始,我没有得到任何等待它们的承诺,这导致了我的问题,当第一个承诺结束时,他执行了
。然后()
callback在数组中返回0张照片,并在其他页面上结束处理之前释放控制器返回。另一个错误是我在整个countTaggedPhotos
方法中执行递归,更改为仅http回调
解决方案:嵌套承诺
var promiseHttp=http(选项)。然后(函数我自己(数据){
var res=JSON.parse(数据);
如果(!res | | res.error){
console.log(!res?)加载照片时出错:res.error);
返回;
}
for(资源数据中的var光指数){
var photo=分辨率数据[photoIndex];
如果(照片标签){
for(photo.tags.data中的var tagIndex){
var tag=photo.tags.data[tagIndex];
if(tag.id==目标){
照片。推送(照片);
}
}
}
}
if(res.paging&&res.paging.next){
var opt={uri:decodeURIComponent(res.paging.next),方法:'GET'};
返回http(opt),然后返回(我自己);
}
});
返回承诺http.返回(照片);
myself(id, target, accessToken, decodeURIComponent(res.paging.next));