gpt4 book ai didi

javascript - Node js - 如何在模块中正确使用异步网络调用

转载 作者:行者123 更新时间:2023-12-03 09:55:18 24 4
gpt4 key购买 nike

因此,对于我正在从事的项目的一部分,我创建了一个模块,该模块使用 Facebook 图形 API 进行调用并返回 JSON 数据。我可以通过 console.log() 方法很好地输出数据,一切都很好。

但我无法从方法返回值,因此我尝试使用“异步”npm 模块。我已经按照网站上的示例进行操作,但仍然在努力让一切正常运行,到目前为止已经花了一整天的时间,但事情看起来仍然没有变得更清晰。

所以我要问的是:

  • 首先,我需要调用为 fbgraph api 设置authentication_token 的方法,然后才能执行其他操作
  • 然后我需要调用每个函数(以任何顺序)并获取每个函数的 json 结果并将其添加到一个大的 json 结果中
  • 最后,我需要将这一大 json 结果返回到我的原始 javascript 页面(即使它当前位于模块中),我将如何调用它?

这是我原始模块的片段(仅适用于 console.log,无法返回)

module.exports = {
/**
* Pass the access token to the fbgraph module
* and call other methods to populate
*/
setUp: function (access_token) {
graph.setAccessToken(access_token);
},

/**
* Fetches users basic info:
* Age, Gender, Hometown, Relationship status
*/
getBasicInfo: function(){
graph.get("/me/", function(err, res) {
var result = {
'age' : _calculateAge(res.birthday),
'gender' : res.gender,
'hometown' : res.hometown.name,
'relationship_status' : res.relationship_status
};
//console.log(result);
return result;
}, function(){ console.log("DONE");});
},
/**
* Creates a body of text as a string
* made up of all the users status updates
*/
getPosts: function(){
graph.get("/me/feed?limit="+PHOTO_LIMIT, function(err, res) {
var posts = "";
for(var i=0;i<res.data.length;i++){
var obj = res.data[i];
if(obj.message!=undefined) posts += obj.message+"\n";
}
//console.log(posts);
return {'posts':posts};
});
},
/**
* Fetches a single dimension string array of
* photos user is tagged in
*/
getPhotos: function(){
graph.get("/me/photos?limit="+PHOTO_LIMIT, function(err, res) {
var photos = [];
for(var i=0;i<res.data.length;i++){
var obj = res.data[i];
photos.push(obj.source); // .source is full size image, .picture is a thumbnail
}
return {'photos': photos};
});
}
}

本模块的其余部分以类似的方式继续我尝试过使用并行异步

module.exports = {
getFacebookInfo: function (access_token) {
results = {};
setUp(access_token);
async.parallel([
facebookDataRequests.getBasicInfo(),
facebookDataRequests.getPosts()

任何关于我应该如何构建它的指导将非常感激,提前致谢

最佳答案

我建议您以不同的方式构建它。无需向 Facebook 调用 3 次电话,因为您也可以通过一次电话获取信息。

那么,我会做什么:

  1. 使用字段扩展调用 Facebook Graph API
  2. 格式化结果
  3. 返回结果

此外,我建议您使用 Promise 库,例如 Q

类似这样的东西(未经测试!):

module.exports = {
getFacebookInfo: function (access_token) {

setUp(access_token);

function setUp(access_token) {
graph.setAccessToken(access_token);
}

function getFBInfo() {
var deferred = Q.deferred();
graph.get("/me?fields=id,name,birthday,gender,hometown,relationship_status,feed.limit(25),photos.limit(25)", function(err, res) {
if (err) deferred.reject(err);
deferred.resolve(res);
});
return deferred.promise
}

function handleResult(result) {
var deferred = Q.deferred();

result.posts = result.feed.data
delete result.feed.data;

result.photos = result.photos.data
delete result.photos.data;

deferred.resolve(result);

return deferred.promise
}

Q.fcall(getFBInfo)
.then(handleResult)
.then(function(result) {
return result;
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
}
}

在你的主文件中:

var FB = require('./path/to/file/above');

var results = FB.getFacebookInfo('ACCESS_TOKEN_SDAIOFHIOSDHFOSO');

关于javascript - Node js - 如何在模块中正确使用异步网络调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com