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
});
});
}
从下面的代码中,我想 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
});
});
}