javascript - 带 promise 的异步循环?

标签 javascript typescript ecmascript-6 promise es6-promise

我有以下代码,它注册了一系列 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));
    }
}

如何确保 emitInitialPackagecomplete 解析之前完成?

最佳答案

要等待 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/

相关文章:

javascript - 如何创建用户不可编辑的 HTML 表单默认短语?

html - Angular 跨度

typescript :抽象类的实例

javascript - 是否可以处理 2 个变量以更改 if/else 条件在 ES6 上是否为真?

reactjs - react 中的传播运算符抛出意外 token 的错误

javascript - 等价于 ES6 中的 Prototype

javascript - 如何在保存打印页面时为文件创建自定义文件名?

javascript - 使用动态函数设置给定类的背景颜色

javascript - 如何在 AngularJS 和 Ionic Auth 中设置可重用代码?

javascript - 在页面构造函数中调用函数会导致空数组