在Javascript中模拟同步用户交互

时间:2017-03-06 22:18:03

标签: javascript ionic-framework

我有一系列问题要问用户,后面的问题取决于之前的问题。通过假装我们可以拥有同步i / o来表达最简洁,如下所示:

//'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()之类的函数不阻止执行,而是在用户选择选项时自己调用回调(通过promise机制)。因此,如果我们将ionicPopup.show用于queryuser,我们将立即获取所有弹出窗口,并且决策树将在null返回值上执行。

我们是否可以在一个行为与ionicPopup.show()行为相似的函数中包装queryuser或类似物?

(最好比用于编写C协同程序的Duff设备更钝)。

或者失败了,如何在没有深深回调地狱的情况下表达如上所述的决策树?

1 个答案:

答案 0 :(得分:1)

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

但是既然你在询问协同程序,你也可以使用生成器函数并通过查询框架异步驱动它们。特别是CSP允许对异步用户界面进行很好的抽象。