knex无法使用后的回调功能

时间:2018-09-10 17:25:25

标签: node.js promise knex.js

从下面的代码中,我想选择一些数据,然后更新  适合条件,最后运行两个URL来完成其他一些任务。

我可以更新第二个knex更新查询,但是,它无法运行两个发布请求中的任何一个,我想知道为什么吗?

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;
                       });
                   }
              }
          }
        }
  }});

1 个答案:

答案 0 :(得分:0)

已发布的代码已删除,因此很难精确显示如何重构它,但是有必要的更改和建议的更改。

建议的更改是使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
        });
    });
}