非常一个nodejs noob,试图理解承诺,等待,异步。我保证你做了我的尽职调查研究(花了一整天的时间研究以获得下面的代码。我仍然不完全确定一切都是应该的,并且找不到具有完全相同的参考(或关闭)我想在这里做的事情。
感谢您的帮助。
一般结构:
函数 msg()正在等待4个函数完成,4个api调用(代码只显示一个):函数 redditPromise ()。
redditPromise ()调用异步函数 redditGet () - >那个将调用reddit API的人,同时将API数据保存到数据库中。 (功能 saveToDb ())
var nodeSocialApi = require('node-social-api');
var Socstat = require('../proxy').Socstat;
exports.index = function (req, res, next) {
/* SAVES DATA TO MONGODB */
function saveToDb(website,total) {
//** Start : NewAndSave
Socstat.newAndSave(website, total, "random", function (err, socstat) { // newAndSave -> proxy/socstat.js
if (err) {
return next(err);
}
});
//** End : NewAndSave
}
/* END SAVES DATA TO MONGODB */
/* GET DATA FROM REDDIT API */
const reddit = new nodeSocialApi.Reddit(); // no auth needed
async function redditGet() {
let result;
await reddit.get('r/about/about.json')
.then((data) => {
// callback value for promise
result = data.data.subscribers;
saveToDb("reddit",result);
}) // end then
.catch(err => console.log(err));
return result;
}
/* END : GET DATA FROM REDDIT API */
/* REDDIT PROMISE (all the others look the same) */
function redditPromise() {
return new Promise(resolve => {
resolve(redditGet());
});
}
/* END : REDDIT PROMISE (all the others look the same) */
/* ONE FUNCTION THAT WAITS FOR ALL PROMISED FUNCTIONS */
async function msg() {
const [a, b, c,d] = await Promise.all([githubPromise(), twitterPromise(), redditPromise(), facebookPromise()]);
console.log(a + " " + b + " " + c + d);
}
/* END: ONE FUNCTION THAT WAITS FOR ALL PROMISED FUNCTIONS */
msg();
}; // END exports
答案 0 :(得分:0)
希望我做得对,把它写成一个新的答案"。基本上只是想表明我没有把这里的帮助视为理所当然。一直在努力支付我的会费。
基于评论(@HMR),我尝试将一些函数转换为async / await。 我想我不确定两件事: 1)是我的最终返回response.fan_count等待saveToDb完成?我尝试将return response.fan_count放在saveToDb.then承诺中,但这不起作用。 2)我应该将saveToDb.then()结构转换为async / await吗?
const facebookGet = async () => {
facebookGet () {
//just return a promise:
let response; // outside to be able to return in the end
try {
response = await facebook.get('1118720888180564/fields=fan_count');
console.log(response.fan_count);
saveToDb("facebook",response.fan_count)
.then(dbResult => {
console.log("db entry succesfull -> " + dbResult); // returns the database object
})
.catch(err => console.error(err));
}
catch (err) {
console.log("fetch failed ", err);
}
return response.fan_count;
}
回答我自己的问题1)
投入"返回"之前" saveToDb" ...允许我写"返回response.fan_count"在" .then"
内