我正在努力修復爲老版本的Dojo編寫的相對較舊的應用程序中的錯誤,即使那時也從未正常工作,現在正在Dojo 1.10上運行。一些應用程序邏輯對於當前的Dojo範例來說並不完全正確,但其中一些似乎適合我,我無法弄清楚它爲什麼不能按預期工作。爲什麼我的Dojo ContentPane在加載內容後解析其承諾?
有一個基於dijit.layout.ContentPane
的自定義小部件。所添加的方法都不會破壞原始內容,只能通過主題將一些滾動事件連接到其他小部件。還有一個主題可以觸發ContentPane中的地址更改。
相關位是這個樣子:
// The widget is initially setup declarative markup
var contentPaneWidget = registry.byId("<content_pane_id>");
// This subscribe is actually part of the custom widget code, but
// the topic subscription and resulting set() work, so I don't think
// where this is run is relevant to the question
topic.subscribe("navEvent", function(url) {
contentPaneWidget.set("href", url).then(function() {
topic.publish("navComplete", url);
}, function(err) {
console.log("Navigation error:", err);
});
});
// This topic subscription in another widget should get fired after
// content loads in the ContentPane based widget
topic.subscribe("navComplete", function(url) {
console.log("Navigation finished:", url);
});
// Test the chain ov events by firing off a new URL to the nav topic
topic.publish("navEvent", "<new_content_url>");
內容正確加載。 URL被解析並加載,內容窗格隨下載的內容一起更新。 麻煩的是.then()
功能永遠不會觸發,因此navComplete主題從未激活。有趣的是不僅僅是不成功的功能不起作用,錯誤功能也不會起作用。承諾只是保持開放。
如果我手動解決承諾(通過將.resolve()
添加到鏈的末尾或稍後在代碼中調用contentPaneWidget.onLoadDeferred.resolve()
或從控制檯手動調用contentPaneWidget.onLoadDeferred.resolve()
),那麼所有內容都按預期啓動。 As documentedset("href", ...)
正在回覆諾言,諾言只是在網絡操作和內容呈現完成後才解決。
這是不正確的用法? Dojo中有錯誤嗎?或者我在這個應用程序代碼中尋找其他gremlin?
的延期中的決心一試內/抓住。我猜你正在加載的內容會激發一個JS錯誤,並且錯誤被try catch所吞噬,所以你什麼都看不到 – ben
@ben Cha-ching我們有一個贏家!圍繞'set('href',...)'的應用程序中的整個代碼塊被包裝在一個try語句中,這個語句干擾了Dojo所做的任何事情。我刪除了嘗試大量的嘗試塊,並用只包裝已知會拋出異常的兩行代替它,應用程序突然將所有主題頻道再次運行!你能否將可能的嘗試/接受互動問題寫成答案,以便我可以接受? – Caleb
它幫了大忙!在大多數情況下,「try/catch」比解決方案更具問題;) – ben