【发布时间】:2017-11-30 12:52:22
【问题描述】:
非常像一个 nodejs 菜鸟,试图理解 Promise、await、async。我向你保证我做了尽职调查研究(花了一整天的时间来研究下面的代码。我仍然不能完全确定一切都应该是这样,并且找不到具有完全相同的东西(或足够接近)的参考我在这里尝试做的事情。
感谢您的帮助。
一般结构:
function msg() 正在等待 4 个函数完成,这 4 个 api 调用(代码只显示了一个):function 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
【问题讨论】:
-
您在运行代码时是否遇到错误?
-
代码有问题吗?看起来代码会起作用。也许最好将其发布在Code Review
-
为什么
twitterPromise调用redditGet?真的,这整个函数是多余的——你可以(也应该)直接调用redditGet,得到一个结果完全相同的promise。 -
您的
saveToDb函数没有返回承诺。它确实应该,以便您可以在需要时等待它。 (如果没有,你should at least handle errors from it)。 -
代码没有问题,但这并不意味着我不期望将来会出现任何问题。例如,正如您所指出的,如果数据库调用失败怎么办。非常感谢您抽出宝贵时间。我将再花几个小时使用您提供的链接来编写 DB 调用的承诺(以及 @raghu 和 @HMR 提出的其他优化)
标签: javascript node.js asynchronous promise