云功能-如何避免嵌套承诺?

时间:2020-02-07 04:49:01

标签: javascript node.js firebase promise google-cloud-functions

我第一次在NodeJS中编写Cloud Functions,并且运行良好,但是每当我尝试进行部署时,我都会收到如下警告:

警告避免嵌套promises promise / no-nesting(第9行)

我试图摆脱这种情况,但是我需要解决一些问题:

exports.updateUserCount = functions.pubsub.schedule('every 2 minutes').onRun(context => {
    return admin.database().ref('/servers').once('value').then(snapshot =>{

        var ips = {}
        snapshot.val().forEach( (server, i) => { ips[server.label] = server.ipv4[0] })

        var promises = snapshot.val().map( (server, index) => {
            let sftp = new Client()
            return Promise.all([sftp, server.label, index, sftp.connect({ host : server.ipv4[0], port : '22', username : 'user_name', password : '*********' })])
            .then( values => {
                return Promise.all([values[0], values[0].get('/etc/openvpn/server/openvpn-status.log'), values[1], values[2]])
            }).then( data => {
                data[0].end()
                if (data[1]) {
                    let count = countWords(data[1].toString(),"client_list") - 1
                    console.log(count, `users connected now with ${data[2]} ${data[3]}`)

                    return Promise.all([ count, admin.database().ref(snapshot.child(index.toString()).ref).update({ userCount : count }) ])
                }
                console.log('file not found')
            return false
            }).catch(err => {
              console.log(err);
            });
        })

        console.log(`array ${JSON.stringify(ips)}`)
        return Promise.all(promises)
    }).catch(err => {
        console.log(err);
    });
});

如果我尝试将其他代码放在嵌套之外,则无法获得sftp的实例,并且不能全局声明它,因为每个sftp都连接到不同的服务器并具有不同的配置。

任何帮助将不胜感激,谢谢。

0 个答案:

没有答案