为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用
Why does one method of stacking promises in Lightswitch work when another doesn't?
我正在使用Lightswitch 2015应用程序来跟踪客户满意度访谈。 我正在尝试创建一个函数,该函数将创建一个新的采访,填充一些项目,然后将其保存到数据库中,然后在新窗口中打开它进行编辑。 在这种情况下,我正在努力理解承诺的行为。
我有以下三个代码组:
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 按预期工作;即,创建新的采访,填充字段,然后打开编辑窗口。 但是,我担心从 lambda 函数内部抛出的错误不会正确传递到外部上下文。
2 和 3 都创建了一个新的采访并填充字段,但随后抛出一个错误,指出"屏幕导航时无法执行此操作",这似乎表明它没有等待每个承诺实现,然后再尝试执行下一个承诺。 3 似乎也可能是将承诺包装在其他承诺中,这可能会再次导致无法正确地向外传递任何抛出的错误(而且,我听说,对于努力理解承诺的人来说,这是一种非常常见的反模式?
有人可以帮助我了解这里到底发生了什么吗? 我一直在努力寻找嵌套承诺或使用一系列承诺的正确最佳实践;任何正确处理此问题的帮助将不胜感激!
你总是需要将回调函数传递给then
,而不是立即调用它的结果。
你想要
screen.closePopup()
.then(myapp.applyChanges) // or () => myapp.applyChanges()
.then(() => myapp.showInterview_AddEdit(NewInterview)),
.catch(error => { msls.showMessageBox(error.toString()); });
有关为什么需要该catch
(比使用第二个then
参数更好(,请参阅 .then(成功,失败(何时被视为承诺的反模式?。
相关文章:
- Javascript袖珍参考,第121页:这是怎么回事;猴子补丁”;方法应该有效
- 在jQuery中创建向下滑动子菜单的最有效方法
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- 将JSON存储和恢复到此Ionic应用程序的最有效方法
- 将javascript数组中的项移动到特定位置的有效方法
- 将JS对象数组转换为嵌套形式的最有效方法
- 隐藏具有特定类$.each、for等的元素的有效方法
- 什么's是调用具有可变参数的函数的有效方法
- 选择具有特定数据的所有 html 标记的最有效方法是什么 - [适当性],无论值如何
- 使用 jQuery 调用 PHP 端点的最有效方法
- 比使用大量其他 if 语句更有效的方法
- 为什么不't我的Javascript,如果其他方法有效的话
- 为什么这种用于计算数组重复并将其存储到对象中的方法有效
- 为什么这个javascript单例方法有效
- 为什么此跨域请求解决方法有效
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用
- 用jquery预处理html的一种方法有效,但为什么另一种方法无效't
- 控制器之间共享服务的脏检查,一种方法有效,另一种方法无效
- 在服务器和客户端之间共享JavaScript模型代码,这种方法有效吗