Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js控制器等待异步服务方法_Javascript_Node.js_Recursion_Promise_Sails.js - Fatal编程技术网

Javascript js控制器等待异步服务方法

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

我不太习惯nodejs/javascript中的承诺,基本上我希望我的控制器只在我的承诺运行完之后返回一个值

我在我的Sails应用程序中提供以下服务。我正在使用请求承诺模块向facebook graph api发出HTTP请求

返回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));