如何在变量 NodeJS 上预加载值



我只是在学习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;
...
}

最新更新