我只是在学习NodeJS
,我来自Java/Scala背景。
我正在编写一个与Amazon SNS
通信并处理端点/令牌的服务。
基本上,我的环境中有一个SNS应用程序列表,并且该列表很少被修改,因此我想在服务器启动时将其值预加载到变量或常量中。
亚马逊提供的SNS-SDK
具有以下功能,用于列出应用程序:
listPlatformApplications(params, callback)
所以我天真地试图做的是:
var applications = [];
var loadApplications = function() {
sns.listPlatformApplications({}, function(err, data){
if (err) {
console.log(err);
} else {
return data['PlatformApplications'].map(function (app) {
return app['PlatformApplicationArn']
});
}
});
}
loadApplications();
基本上发生的情况是,当列表仍然为空时,一些调用在此回调完成之前进入。
在服务器开始响应请求之前,我将如何预加载此数据或任何其他数据?
或者也许我对此的推理是错误的,并且会有另一种方法来处理NodeJS
更惯用
如果您绝对必须使用回调而不是承诺(剧透警告:您没有(,则必须在 SNS 回调中调用服务器启动命令。所以你会做这样的事情:
var startServer = require('my-server.js');
var applications = [];
var loadApplications = function() {
sns.listPlatformApplications({}, function(err, data){
if (err) {
console.log(err);
} else {
var snsData = data['PlatformApplications'].map(function (app) {
return app['PlatformApplicationArn']
});
startServer(snsData)
}
});
}
loadApplications();
==推荐解决方案==
相反,您可以使用承诺(您绝对应该!(,您可以在服务器启动时启动SNS请求并在需要时等待结果。您的代码如下所示:
const startServer = require('my-server.js');
const loadApplications = async () => {
const data = sns.listPlatformApplications({}).promise();
const snsData = data['PlatformApplications'].map(function (app) {
return app['PlatformApplicationArn']
});
return snsData;
};
const applications = loadApplications();
startServer(applications);
// inside my-server.js
const startServer = async (applications) => {
const doSomethingWithApplications = await applications;
...
}