我正在开发一款Express应用。在启动时,它连接到Redis服务器和PostgreSQL服务器。我想在启动快速服务器之前等待两个连接成功。现在,如果我等待一个回调,我可以在该回调中启动Express服务器。但是,在等待多个异步操作时如何最好地做到这一点?我是新手。做这种事情有一个很好的惯用模式吗?也许将承诺分组在一起或者......?
答案 0 :(得分:3)
承诺就是你想要的。
您可以在一系列承诺上使用.all()
等待所有承诺完成。你没有提到你正在使用的Promise库,但它相当普遍。这是Bluebird文档:https://github.com/petkaantonov/bluebird/blob/master/API.md#all---promise
答案 1 :(得分:1)
承诺可能是解决这个问题的惯用方法。你必须" promisify"您的函数返回回调以将它们转换为返回并解析promise的内容,但是Promise.all()
将正常工作。我个人使用Bluebird进行nodejs开发,并定期宣传使用异步回调的现有函数或整个模块。
如果您没有使用可以宣传未承诺功能的库,那么您也可以使用计数器来跟踪所有回调的完成时间。这是老式的"做事的方式,但也很好。这样的操作就像这样:
function setup(fn) {
// initialize counter to number of async operations
var counter = 3;
function checkDone() {
--counter;
if (counter <= 0) {
fn();
}
}
firstAsyncFunction(...., checkDone);
secondAsyncFunction(...., checkDone);
thirdAsyncFunction(...., checkDone);
}
setup(function() {
// this will get called when all the initial async operations are done
});
答案 2 :(得分:0)
就我而言,在启动我的应用程序之前,我需要等待mongodb和redis连接。下面是我的实现。
注意:我正在使用Koa,但是相同的实现也应该与Express.js一起使用。
redis-connection.ts文件
let your_bytes = Buffer.from(your_base64, "base64");
db-connection.ts文件
import redis from 'redis'
const redisConnection = (app) => {
const client = redis.createClient({ url:'connectionString' })
client.set('hello', 'world', (err)=> {
if(err) {
throw err
}
app.emit('redis-connected')
})
}
export default redisConnection
app.ts文件
import mongoose from 'mongoose';
const dbConnection = (app) => {
mongoose.connect('connectionString', {
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true,
useFindAndModify: false
});
mongoose.connection.once('open', () => {
app.emit('db-connected');
});
return mongoose;
};
export default dbConnection;
index.ts文件
'use strict'
import Koa from 'koa'
import dbConnection from './config/connections/db-connection'
import redisConnection from './config/connections/redis-connection'
const app: Koa.DefaultState = new Koa()
// Perform db connection
dbConnection(app)
// Perform redis connection
redisConnection(app)
export default app