2017-03-06 49 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允許對異步用戶界面進行很好的抽象。