【问题标题】:Asynchronous communication cross pages异步通信跨页面
【发布时间】:2017-03-09 17:59:16
【问题描述】:

我有一个页面addin.html。它可以通过

弹出另一个页面editor(不一定在同一个域中)
popup = window.open("https://localhost:3000/#/posts/editor/", "popup")

那么,两个页面每个内部都有一个监听器,可以通过

相互发送数据
// listen:
function receiveMessage(event) {
    document.getElementById("display").innerHTML = JSON.stringify(event.data);
}
window.addEventListener("message", receiveMessage, false);

// send:
function sendMessage() {
    popup.postMessage("data", popup.location.href);
}

editorui-router 实现。最初,它在加载页面之前解析init

.state('editor', {
    controller: 'EditorCtrl',
    resolve: { init: [ ... ] },
    ...
};

app.controller('EditorCtrl', ['$scope', 'init', function ($scope, init) {
    ...
}]

我现在要实现的是,addin.html弹出editor时,它会向editor发送一些数据,而init需要在加载页面之前解析这些数据。 editor 在接收到来自addin.html 的数据之前可能会挂起。

有谁知道如何修改接收者和发送者(以及其他东西)来完成这个?

【问题讨论】:

  • 你不能通过 URL 参数传递这个初始数据吗?
  • 可能有很多数据,我如何将它们嵌入到window.open
  • 选择不多。如果数据太大,请使用服务器端会话来存储和检索数据。或者使用 POST 发送数据。
  • @estus ,我不明白你的建议......不像editoraddin.html 没有服务器,也不是用angularjs构建的。
  • 如果 addin.html 很重要,你为什么不说什么?该页面不需要它自己的服务器来在那里发送东西。它只需要 一些 服务器。为什么它不是用 Angular 构建的呢?它可以使用 JS,从而做我建议的事情。

标签: javascript asynchronous angular-ui-router cross-domain postmessage


【解决方案1】:

你可以返回一个自定义的 Promise 并在任何时候像下面的代码那样解决它

.state('editor', {
  controller: 'EditorCtrl',
  resolve:{
    init: function($q){
         var deferred = $q.defer();
         window.addEventListener("message", function(event){
              deferred.resolve(event.data);
         }, false);
         return deferred.promise;
     }
  }
});

控制器在实例化之前等待上述项目完全解决。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-05-21
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多