我无法解决我的Angular 2代码出错的问题。我的承诺没有返回正确的结果。
我的代码如下所示:
this.addPlan('My plan title9', "YES9")
.then((id)=>{
console.log('Promise return was: ' + id);
})
.catch((err)=>{
console.log('Call to addPlan failed with err = ' + err);
});
addPlan(title, security)
{
let timeStamp = new Date().toISOString();
let plan = {
_id : 'PLAN:' + timeStamp,
title : title,
security : security,
notes : [],
flags : [],
created : timeStamp,
updated : timeStamp
};
return new Promise(resolve =>
{
var theID;
this._DB.put(plan)
.then(function (response) {
console.log(JSON.stringify(response));
resolve(response.id);
theID = response.id;
})
.catch((err) =>
{
console.log('addPlan error is: ' + err);
this.success = false;
});
if(this.success)
{
this.handleSyncing();
resolve(theID);
}
});
}

当调用this.addPlan(...)
时,服务器日志为:
Promise return was: undefined
{"ok":true,"id":"PLAN:2017-01-09T18:16:50.094Z","rev":"1-ac45a4785982fcbbcb46dd099431ecb6"}
承诺的回报是不确定的,因为它应该是' id'的价值。此外,控制台首先显示Promise消息,但我希望它在promise返回后显示。
显然我在这里犯了一个新手错误,但我无法看到它是什么。
答案 0 :(得分:3)
错误是if(this.success)
,因为您将异步代码视为同步。您创建的新承诺块内的所有内容都将同步运行。
观察输出,理解会发生什么应该是相当直接的:
if
将评估为true
并解析尚未定义的内容
值。put()
函数调用完成并将响应记录到控制台。您还在实施deferred anti-pattern。由于put()
函数已经返回一个,因此无需创建新的承诺。只需返回那个并从.then()
中返回响应,它将把它包装在一个promise中并解决它。我在下面的代码中省略了this.handleSyncing();
,因为它不完全清楚它是做什么的。
function addPlan(title, security) {
let timeStamp = new Date().toISOString();
let plan = {
_id: 'PLAN:' + timeStamp,
title: title,
security: security,
notes: [],
flags: [],
created: timeStamp,
updated: timeStamp
};
return this._DB.put(plan)
.then((response) => {
console.log(JSON.stringify(response));
return response.id;
//^^^^^^----- This will wrap the response.id in a promise and will be the resolved value
})
.catch((err) => {
console.log('addPlan error is: ' + err);
this.success = false;
});
}
答案 1 :(得分:2)
您不必创建新的承诺
你可以回复“this._DB.put(plan)”承诺:
addPlan(title, security){
let timeStamp = new Date().toISOString();
let plan = {
_id : 'PLAN:' + timeStamp,
title : title,
security : security,
notes : [],
flags : [],
created : timeStamp,
updated : timeStamp
};
return this._DB.put(plan).then(response => {
return response.id
})
}
和then()的响应将等于id:
this.addPlan('My plan title9', "YES9").then((id)=>{
console.log('Promise return was: ' + id);
})