我检查表中是否存在帖子。如果没有,我插入它。所以我需要进行两次异步调用。我可以用承诺做到这一点吗?
var insertOrUpdateBuilding = (callback)=>{
// Check if building exists
db('buildings')
.where({externalId: buildingId})
.then(function(rows){
// Building exist, do nothing
if(rows){
callback ();
}
// Building does not exist. Insert it
if(!rows){
return db('buildings').insert({externalId: buildingId, name: req.body.name})
}
})
.then(function(promise){
})
.catch(function(err){
callback({message: 'Error looking up building', err: err})
})
};
我被困住了。我该怎么办?
答案 0 :(得分:3)
承诺是粘性的,一旦你开始使用它们,每个涉及的功能都必须接受并返回承诺。在您的示例中,如果承诺db()
,那么insertOrUpdateBuilding
也应该返回一个承诺,即db(...)
附加了一些then
var insertOrUpdateBuilding = () => db('buildings')
.where({externalId: buildingId})
.then(rows => rows ||
db('buildings').insert({externalId: buildingId, name: req.body.name}))
;
和任何打电话给insertOrUpdateBuilding
的人都应该得到承诺:
insertOrUpdateBuilding().then(okay).catch(error!)
请注意,它通常对较低级别函数中的catch
错误没有意义(除了记录/调试目的)。让误差传播到上层,你可以以合理的方式处理它,例如告知用户。
答案 1 :(得分:0)
尝试使用ES7 async / await。
var async insertOrUpdateBuilding = (callback) => {
try {
// Check if building exists
let rows = await db('buildings')
.where({externalId: buildingId});
// Building exist, do nothing
if (rows){
callback();
}
// Building does not exist. Insert it
if (!rows) {
let row = await db('buildings').insert({
externalId: buildingId,
name: req.body.name
});
callback();
}
} catch (e) {
callback({message: 'Error looking up building', err: e});
}
};