2017-03-06 47 views
1

我有一系列问题想问问用户,后面的问题取决于以前的问题。通过假装我们可以具有同步I/O来简化表达,如下所示:模拟Javascript中的同步用户交互

//'queryuser' is a callback which provides synchronous user interaction 
function seriesOfQuestions(queryuser) 
    var drink = queryuser("What would you like to drink?",["Tea","Coffee","Orange Juice"]); 
    if (drink=="Tea" || drink=="Coffee") 
    { 
     var milk = queryuser("Would you like milk?",["Yes","No"]); 
     var sugar = queryuser("Would you like sugar?",["Yes","No"]); 
     if (milk=="Yes") 
      var milk_type = queryuser("Normal or soya?",["Moo juice","Hippy beans"]); 
    } 
    queryuser("Would you like a biscuit?",["Yes","No"]); 
    //...etc... deep decision tree, though note code paths can re-join for biscuits 
} 

Javascript当然不会像这样工作;诸如$ionicPopup.show()之类的函数不会阻止执行,而是在用户选择一个选项时自己调用回调(通过承诺机制)。因此,如果我们使用ionicPopup.show作为queryuser,我们将立即获得所有弹出窗口,并且决策树将在null返回值上执行。

有没有一种方法可以包装ionicPopup.show()或类似的功能,其行为就像我们想queryuser的行为?

(最好大于达夫设备用于编写C协程少钝...)

如果不行的话,怎么能决策树像上面而不在回调地狱冥结束表达?

+0

为什么不直接使用es6 Promises?使用'.then'系列可以在弹出关闭时解析(),也可以输出前面的步骤来计算如何表现 –

+0

您可以通过将决策分配给对象来跟踪状态,然后将该对象向下传递给承诺链。这样你不会最终嵌套你的回调。 – 4castle

+0

@Mirko我在想这个,但我会在哪里保留上面的牛奶变量? –

回答

1

如果您的查询返回承诺,您正在寻找ES8 async/await

但是,由于您询问了协同程序,您还可以使用生成器函数并通过查询框架异步驱动它们。尤其是CSP允许对异步用户界面进行很好的抽象。