[英]Chaining a promise
我检查表中是否存在帖子。 如果没有,我将其插入。 因此,我需要进行两个异步调用。 我可以兑现承诺吗?
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})
})
};
我被卡住了。 我该如何进行?
承诺是粘性的,一旦开始使用它们,每个涉及的功能也将必须接受和返回承诺。 在您的示例中,如果答应了db()
,那么insertOrUpdateBuilding
应该返回一个答应,即db(...)
并附有一些then
s
var insertOrUpdateBuilding = () => db('buildings')
.where({externalId: buildingId})
.then(rows => rows ||
db('buildings').insert({externalId: buildingId, name: req.body.name}))
;
并且insertOrUpdateBuilding
应该保证insertOrUpdateBuilding
调用insertOrUpdateBuilding
:
insertOrUpdateBuilding().then(okay).catch(error!)
请注意,在较低级别的函数中catch
错误通常没有任何意义(除了记录/调试目的)。 让错误传播到更高级别,您可以在其中以明智的方式进行处理,例如通知用户。
尝试使用ES7异步/等待。
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});
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.