为什么在 Lightswitch 中一种堆叠承诺的方法有效而另一种无效?
Why does one method of stacking promises in Lightswitch work when another doesn't?
我正在使用 Lightswitch 2015 应用程序来跟踪客户满意度访谈。我正在尝试创建一个函数来创建一个新的采访,填充一些项目,然后将其保存到数据库,并在新的 window 中打开它进行编辑。在这种情况下,我正在努力理解承诺的行为。
我有这三组代码:
1)
myapp.Interviews_Management.AddInterview_Tap_execute = function (screen)
{
var NewInterview = screen.Interviews.addNew();
NewInterview.c_Date = screen.InterviewDate;
NewInterview.Participant = screen.Interviewee;
NewInterview.Location = screen.InterviewFocusLocation;
screen.closePopup()
.then(() =>
{
myapp.applyChanges()
.then(() =>{ myapp.showInterview_AddEdit(NewInterview); });
}, (error) =>{ msls.showMessageBox(error.toString()); });
};
2)
myapp.Interviews_Management.AddInterview_Tap_execute = function (screen)
{
var NewInterview = screen.Interviews.addNew();
NewInterview.c_Date = screen.InterviewDate;
NewInterview.Participant = screen.Interviewee;
NewInterview.Location = screen.InterviewFocusLocation;
screen.closePopup()
.then(myapp.applyChanges()
.then(myapp.showInterview_AddEdit(NewInterview),
(error) =>{ msls.showMessageBox(error.toString()); })
);
};
3)
myapp.Interviews_Management.AddInterview_Tap_execute = function (screen)
{
var NewInterview = screen.Interviews.addNew();
NewInterview.c_Date = screen.InterviewDate;
NewInterview.Participant = screen.Interviewee;
NewInterview.Location = screen.InterviewFocusLocation;
screen.closePopup()
.then(myapp.applyChanges())
.then(myapp.showInterview_AddEdit(NewInterview),
(error) =>{ msls.showMessageBox(error.toString()); });
};
1 按预期工作;也就是说,创建新采访、填充字段并打开编辑 window。但是,我担心从 lambda 函数内部抛出的错误不会正确传递到外部上下文。
2 和 3 都创建了一个新的采访并填充了字段,但随后抛出一个错误说 "This action cannot be taken while screen is navigating.",这似乎表明它在尝试执行下一个承诺之前没有等待每个承诺实现一。 3 似乎也可能将承诺包装在其他承诺中,这可能再次导致无法正确地向外传递任何抛出的错误(而且,我听说,对于那些努力理解承诺的人来说,这是一种非常常见的反模式?)。
有人可以帮助我了解这里到底发生了什么吗?在嵌套承诺或使用一系列承诺方面,我一直在努力采用适当的最佳实践;任何有关正确处理此问题的帮助将不胜感激!
您总是需要将回调函数传递给then
,而不是立即调用它的结果。
你想要
screen.closePopup()
.then(myapp.applyChanges) // or () => myapp.applyChanges()
.then(() => myapp.showInterview_AddEdit(NewInterview)),
.catch(error => { msls.showMessageBox(error.toString()); });
为什么 catch
是必要的(比使用第二个 then
参数更好),请参阅 When is .then(success, fail) considered an antipattern for promises?。
我正在使用 Lightswitch 2015 应用程序来跟踪客户满意度访谈。我正在尝试创建一个函数来创建一个新的采访,填充一些项目,然后将其保存到数据库,并在新的 window 中打开它进行编辑。在这种情况下,我正在努力理解承诺的行为。
我有这三组代码:
1)
myapp.Interviews_Management.AddInterview_Tap_execute = function (screen)
{
var NewInterview = screen.Interviews.addNew();
NewInterview.c_Date = screen.InterviewDate;
NewInterview.Participant = screen.Interviewee;
NewInterview.Location = screen.InterviewFocusLocation;
screen.closePopup()
.then(() =>
{
myapp.applyChanges()
.then(() =>{ myapp.showInterview_AddEdit(NewInterview); });
}, (error) =>{ msls.showMessageBox(error.toString()); });
};
2)
myapp.Interviews_Management.AddInterview_Tap_execute = function (screen)
{
var NewInterview = screen.Interviews.addNew();
NewInterview.c_Date = screen.InterviewDate;
NewInterview.Participant = screen.Interviewee;
NewInterview.Location = screen.InterviewFocusLocation;
screen.closePopup()
.then(myapp.applyChanges()
.then(myapp.showInterview_AddEdit(NewInterview),
(error) =>{ msls.showMessageBox(error.toString()); })
);
};
3)
myapp.Interviews_Management.AddInterview_Tap_execute = function (screen)
{
var NewInterview = screen.Interviews.addNew();
NewInterview.c_Date = screen.InterviewDate;
NewInterview.Participant = screen.Interviewee;
NewInterview.Location = screen.InterviewFocusLocation;
screen.closePopup()
.then(myapp.applyChanges())
.then(myapp.showInterview_AddEdit(NewInterview),
(error) =>{ msls.showMessageBox(error.toString()); });
};
1 按预期工作;也就是说,创建新采访、填充字段并打开编辑 window。但是,我担心从 lambda 函数内部抛出的错误不会正确传递到外部上下文。
2 和 3 都创建了一个新的采访并填充了字段,但随后抛出一个错误说 "This action cannot be taken while screen is navigating.",这似乎表明它在尝试执行下一个承诺之前没有等待每个承诺实现一。 3 似乎也可能将承诺包装在其他承诺中,这可能再次导致无法正确地向外传递任何抛出的错误(而且,我听说,对于那些努力理解承诺的人来说,这是一种非常常见的反模式?)。
有人可以帮助我了解这里到底发生了什么吗?在嵌套承诺或使用一系列承诺方面,我一直在努力采用适当的最佳实践;任何有关正确处理此问题的帮助将不胜感激!
您总是需要将回调函数传递给then
,而不是立即调用它的结果。
你想要
screen.closePopup()
.then(myapp.applyChanges) // or () => myapp.applyChanges()
.then(() => myapp.showInterview_AddEdit(NewInterview)),
.catch(error => { msls.showMessageBox(error.toString()); });
为什么 catch
是必要的(比使用第二个 then
参数更好),请参阅 When is .then(success, fail) considered an antipattern for promises?。