【发布时间】:2017-07-18 09:26:32
【问题描述】:
我有以下代码,它注册了一系列 socketio 命名空间。部分逻辑依赖于数据库调用(通过 sequelize),因此我需要使用 Promise。我希望 complete 承诺在所有称为逻辑的构造函数完成后解决。我的问题是 complete 承诺在 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 解析之前完成?
【问题讨论】:
-
不能使用带有异步代码的循环...需要异步循环
-
@elclanrs 好的,那么异步循环会是什么样子?
-
这里有什么不清楚的地方吗?
this.server.of()做什么/返回?cells在构造函数中来自哪里,registerEndPoints中的nsp是什么?为什么要等待 nsp 连接,然后关闭返回的套接字?你为什么这样做:Promise.resolve(db.Line.findAll())? findAll() 要么返回一个 Promise,要么它是同步的,要么它需要一个回调函数。在这些情况下,您都不会通过将其包装在 Promise 中来获得任何收益。 -
@Thomas
this.server.of返回一个 socketio 命名空间。如上面注释行中所述,单元格和路由是从行映射的。我将更新代码示例以更正此问题,但nsp是nsps的成员。不太确定等待 nsp 连接是什么意思?findAll返回一个 bluebird 承诺,所以我使用 Promise.resolve 将其转换为 es6 promsie -
您需要更新
registerEndPoints以返回一个承诺,当所有emitInitialPackage调用完成时,该承诺完成。然后将该承诺作为完整调用的一部分返回。这允许承诺流动(或真正通过map)
标签: javascript typescript ecmascript-6 promise es6-promise