为什么Lightswitch中的一种堆叠承诺方法在另一种方法不起作用时起作用?

时间:2016-02-01 22:26:12

标签: javascript promise winjs visual-studio-lightswitch winjs-promise

我正在使用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似乎也许是在其他承诺中包含承诺,这可能再次导致不能正确地向外传递任何抛出的错误(并且,我听说,对于那些努力理解承诺的人来说,这是一种非常常见的反模式?)。

有人可以帮我理解这里到底发生了什么吗?我一直在努力通过最好的实践来嵌套承诺或使用一系列承诺;任何有关正确处理方法的帮助都将非常感谢!

1 个答案:

答案 0 :(得分:0)

您始终需要将回调功能传递给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?