所以我目前正在尝试使用下面的代码修改promise中的全局对象,但是,当我在最后控制对象时记录对象时,它返回' undefined'关于' id'的关键。我有点困惑的是,为什么在承诺的成功范围内,它不会在患者对象中设置新的密钥和值。提前谢谢!
patient = { first_name: first_name, last_name: last_name, gender: gender, dob: dob }
postgres.findPatient(patient)
.then(function(success){
patient.id = success.id
})
.catch(function(err){
if (err.received === 0) {
postgres.createPatient(patient)
.then(function(success){
postgres.findPatient(patient)
.then(function(success){
patient.id = success.id
})
})
.catch(function(err){
if (err) console.log(err);
})
}
})
console.log(patient) // yields
patient = {
first_name: 'billy,
last_name: 'bob',
gender: 'm',
dob: '1970-01-01' }
答案 0 :(得分:2)
但是,它不是立即执行的。这就是承诺的工作方式。我有点困惑,为什么在承诺的成功范围内,它没有在患者对象中设置新的密钥和值。
当您的代码运行时,它首先开始寻找患者的过程。然后它会运行您的console.log
。数据库查询完成后,它将运行.then
函数,该函数设置id。 console.log
在设置patient.id
之前运行。
如果您将console.log(patient)
放在then
之后,patient.id = success.id
之后,您应该会看到正确的结果。
如果您在then
之后将其放在catch
函数中,则会得到相同的结果(了解有关Promise Chaining的更多信息)。这可能是编写依赖于id
的代码的最佳位置。像这样:
patient = { first_name: first_name, last_name: last_name, gender: gender, dob: dob }
postgres.findPatient(patient)
.then(function(success){
patient.id = success.id
})
.catch(function(err){
if (err.received === 0) {
postgres.createPatient(patient)
.then(function(success){
postgres.findPatient(patient)
.then(function(success){
patient.id = success.id
})
})
.catch(function(err){
if (err) console.log(err);
})
}
})
.then(function () {
console.log(patient);
// Do something with the id
})
答案 1 :(得分:0)
Promise是异步的。在id
执行完毕后,您只会在patient
上看到.then()
键。顶级代码是同步执行的,因此您需要在承诺完成之前查找id
。只有在保证完成承诺时,您才能访问id
之类的链式回调中的.then()
。