为什么我的Dojo ContentPane在加载内容后没有解决其承诺?

时间:2016-08-25 08:24:24

标签: javascript dojo promise dijit.layout

我正在努力修复一个相对较旧的应用程序中的错误,该应用程序是为旧版本的Dojo编写的,即使在那时也从未正常工作,现在正在Dojo 1.10上运行。一些应用程序逻辑对于当前的Dojo范例来说并不完全正确,但有些对我来说似乎是正确的,我无法弄清楚它为什么没有按预期工作。

有一个基于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()或从控制台手动调用),则所有内容都会按预期触发。 As documented set("href", ...)正在返回一个承诺,在网络操作和内容呈现完成后,承诺永远不会得到解决。

这是不正确的用法吗? Dojo中有错误吗?或者我在这个应用程序代码中寻找其他一些gremlin?

1 个答案:

答案 0 :(得分:1)

vtable内的延迟决定 见https://github.com/dojo/dijit/blob/master/layout/ContentPane.js#L440

我猜你加载的内容会引发一个JS错误,vtable会误传这个错误,因此你看不到任何事情......