我有以下代码,它注册了一系列 socketio 命名空间。部分逻辑依赖于数据库调用(通过sequelize),因此我需要使用promise。我希望当所有称为逻辑的构造函数完成时, complete
promise 能够解决。但我的问题是,complete
promise 在 emitInitialPackage()
函数解决之前解决。
export class demoClass {
public complete: Promise<boolean>;
server: any;
constructor(io: any) {
this.server = io;
this.complete = Promise.resolve(db.Line.findAll()).then(lines => {
// do some mapping to generate routes and cells
this.registerEndPoints(routes, [], cells);
}).catch(err => console.log(err))
}
registerEndPoints(routes: Array<string>, nsps: Array<any>, cells: Array<string>) {
for (let i = 0; i < routes.length; i++) {
nsps.push(this.server.of('/api/testNamespace/' + routes[i]));
let that = this;
const nsp = nsps[i];
nsp.on('connection', function (socket) {
that.emitInitialPackage(nsps[i], routes[i], cells[i]);
});
}
}
emitInitialPackage(nsp: any, name: string, cell: any) {
return db.Line.find({/* Some sequelize params*/}).then(results => {
nsp.emit('value', results);
}).catch(err => console.log(err));
}
}
如何确保 emitInitialPackage
在 complete
解析之前完成?
最佳答案
要等待 registerEndPoints
中的所有操作完成,此方法应返回可链接到 db.Line.findAll()
之后的 Promise
> 操作:
export class demoClass {
public complete: Promise<boolean>;
server: any;
constructor(io: any) {
this.server = io;
this.complete = Promise.resolve(db.Line.findAll()).then(lines => {
// return promise created by registerEndPoints method
return this.registerEndPoints(routes, [], cells);
}).catch(err => console.log(err))
}
registerEndPoints(routes: Array<string>, nsps: Array<any>, cells: Array<string>) {
const endPointPromises = routes.map((route, index) => {
// for each endpoint create Promise that gets resolved
// only when all work for endpoint is done
return new Promise((resolve) => {
nsps.push(this.server.of('/api/testNamespace/' + route));
const nsp = nsps[index];
nsp.on('connection', (socket) => {
// resolve promise when emitInitialPackage did its part of the work
this.emitInitialPackage(nsps[index], route, cells[index]).then(resolve);
});
});
});
return Promise.all(endPointPromises);
}
emitInitialPackage(nsp: any, name: string, cell: any) {
return db.Line.find({/* Some sequelize params*/}).then(results => {
nsp.emit('value', results);
}).catch(err => console.log(err));
}
}
关于javascript - 带 promise 的异步循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42491291/