使用async模块节点从函数返回值

时间:2017-03-08 12:45:36

标签: javascript node.js

我正在尝试编写一个使用异步模块的并行函数的函数,并将值返回给调用函数,如此...

_refillActivePool() {
    let _this = this;
    let currentCnt;

    async.parallel([
            function (callback) {
                Participants.count()
                .then(count => {
                    currentCnt = count;
                    callback();
                });
            },
            function (callback) {
                Participants.fetchAll()
                .then(results => {
                    let participants = [];
                    results.forEach(result => {
                        participants.push(result.get('full_name'));
                    });
                    _this._addToActivePool(participants);
                    callback();
                });
            }
        ],
        function (err) {
            if (err) {
                throw err;
            }
            return currentCnt;
        }
    );
}

调用函数看起来像这样

pick() {
    return ActivePool.count()
    .then(count => {
        if (!count) {
            console.log(`new count: ${this._refillActivePool()}`);
        }
    });
}

当我在调用函数中记录返回值时,我得到一个未定义的值。有人可以给我一些指导,告诉我如何实现这个目标,或者更好地实现我的目标。提前谢谢!

1 个答案:

答案 0 :(得分:0)

为了让你的函数返回一个promise(需要使用.then()),你必须做这样的事情:

_refillActivePool() {
    return new Promise(resolve, reject) {
        let _this = this;
        let currentCnt;

        async.parallel([
                function (callback) {
                    Participants.count()
                    .then(count => {
                        currentCnt = count;
                        callback();
                    });
                },
                function (callback) {
                    Participants.fetchAll()
                    .then(results => {
                        let participants = [];
                        results.forEach(result => {
                            participants.push(result.get('full_name'));
                        });
                        _this._addToActivePool(participants);
                        callback();
                    });
                }
            ],
            function (err) {
                if (err) {
                    return reject(err);
                }
                resolve(currentCnt);
            }
        );
    });
}

然后将其运行为:

_refillActivePool().then(value => {
  // use the value here
}).catch(error => {
  // handle error here
});

注意:这未经过测试。它可能仍然有一些问题,而不是我修复的问题。