knex失效后的回调函数

Callback function after knex is not working

从下面的代码中,我想 select 一些数据,然后更新它 合适的条件最后 运行 两个 url 做一些其他的任务。

我可以更新第二个 knex 更新查询,但是 运行 两个 post 请求中的任何一个都失败了,我想知道为什么?

router
    .get('/xxxx', function(req, res){
        _DB_Knex('xxx')
        .where({
            "xxxx": "xxxx"
        })
        .select('xxxx.*', 'xxx.xxx as xxx', 'xxx.xxxx')
        .leftJoin('xxxx', 'xxx.xxx', 'xxx.xxx')
        .then (function (data) {

        if(data && data.length>0){
            for(var i=0; i<data.length; i++){
                if(xxxxx){
                    var xxx = xxxxx;
                    var xxx = data[i].xxxx;
                    var xxx = data[i].xxxx;
                    var xxx = data[i].xxx;

                    if(xxx>=xxx){
                        _DB_Knex('xxxx')
                        .where({
                           xxx: "xxxx",
                           xxx: xxxx                                
                         })
                         .update({
                           xxxx : "xxxx"
                         })
                         .then(function(){
                             request.post({
                                url: `${api_url}/xxxxx/s`,
                                  body: { 
                                    xxx: xxxx
                                  },
                                  json: true
                             });

                             request.post({
                                 url: `${api_url}/xxxx/xxxx`,
                                  body: { 
                                     xxx: xxxx
                                  },
                                 json: true
                             });

                            return null;
                       });
                   }
              }
          }
        }
  }});

发布的代码经过编辑,因此很难准确说明如何重构它,但有一个必需的更改和一个建议的更改。

建议的更改是承诺 router.get()。先看看那个...

// get the xxx route.  return a promse that resolves to the get response
// TODO: error handling
function getXXX() {
    return new Promise(function(resolve, reject) {
        router.get('/xxxx', function(req, res){
            resolve(res);
        });
    });
}

调用那个...

function theOPFunction() {
    return getXXX().then(function(res) {
        return _DB_Knex('xxx')
            .where({ "xxxx": "xxxx" })
            .select('xxxx.*', 'xxx.xxx as xxx', 'xxx.xxxx')
            .leftJoin('xxxx', 'xxx.xxx', 'xxx.xxx')
    }).then(function(data) {
        return loopAndGatherPromises(data);  // see below
    })
}

所需的更改是通过 data 的循环必须收集其中产生的承诺,并 运行 它们与 Promise.all()

function loopAndGatherPromises(data) {
    let promises = [];
    if(data && data.length>0){
        for(var i=0; i<data.length; i++){
            if(xxxxx){
                var xxx = xxxxx;
                var xxx = data[i].xxxx;
                var xxx = data[i].xxxx;
                var xxx = data[i].xxx;

                if(xxx>=xxx){
                    promises.push(updateAndPost(data));
                }
            }
        }
    }
    return Promise.all(promises);
}


// updateAndPost answers a chain of three promises update the db and
// post to two web services. note these 3 chained promises probably
// could be made parallel with promise.all
function updateAndPost(data) {
    return _DB_Knex('xxxx').where({xxx: "xxxx",xxx: xxxx}).update({ xxxx : "xxxx"}).then(function(){
        return request.post({
            url: `${api_url}/xxxxx/s`,
            body: { xxx: xxxx },
            json: true
        });
    }).then(function() {
        return request.post({
            url: `${api_url}/xxxxx/xxxx`,
            body: { xxx: xxxx },
            json: true
        });
    });
}