【问题标题】:Call channel connect function from another js file从另一个 js 文件调用通道连接函数
【发布时间】:2016-03-30 14:28:10
【问题描述】:

我在 phoenix 中有以下文件夹结构:

web/
  static/
    js/
      app.js
      script.js
      socket.js

app.js 有...

import socket from "./socket"

import script from "./script"

brunch-config.js 有...

files: {
    javascripts: {
      joinTo: "js/app.js"
    }
    // ...
}

script.js 有...

$('#some-button').on('click', function() {
    connectToChannel(data);
});

socket.js 有...

import {Socket} from "phoenix"

let socket = new Socket("ws://example.com/updates", {params: {"auth-token": "AUTH-TOKEN"}})

function connectToChannel(data) {
    socket.connect()

    let channel = socket.channel("updates:new", {})
    channel.join()
      .receive("ok", resp => { console.log("Joined successfully", resp) })
      .receive("error", resp => { console.log("Unable to join", resp) })

    channel.on("update", payload => {
        console.log(payload);
    })
}

export default socket

...然而,当我单击 some-button 时,我在浏览器的控制台中收到以下错误:

Uncaught ReferenceError: connectToChannel is not defined

如果我将socket.js 的内容放入script.js 中,则连接成功,但我想将它们分开。

【问题讨论】:

    标签: jquery function sockets phoenix-framework brunch


    【解决方案1】:

    connectToChannel 函数在它所定义的文件中是本地的。api.jsscript.js 都看不到它。

    您可以做的是从socket.js 导出它并将其传递给app.js,如下所示:

    // socket.js
    
    import {Socket} from "phoenix"
    
    let socket = new Socket("ws://example.com/updates", {params: {"auth-token": "AUTH-TOKEN"}})
    
    function connectToChannel(data) {
        socket.connect()
    
        let channel = socket.channel("updates:new", {})
        channel.join()
          .receive("ok", resp => { console.log("Joined successfully", resp) })
          .receive("error", resp => { console.log("Unable to join", resp) })
    
        channel.on("update", payload => {
            console.log(payload);
        })
    }
    // export the function too
    export {socket, connectToChannel}
    
    
    // app.js
    import {socket, connectToChannel} from "./socket"
    
    import script from "./script"
    
    // pass the fn explicitly
    script(connectToChannel);
    

    最后将script.js 包装在一个接收connectToChannel 的函数中:

    export default function(connectToChannel) {
      $('#some-button').on('click', function() {
        connectToChannel(data);
      });
    }
    

    【讨论】:

    • 我在app.js 的行中得到Uncaught TypeError: (0 , _script2.default) is not a function,它说script(connectToChannel);Uncaught TypeError: connectToChannel is not a function 在我正在调用该函数的行上。
    • 您是否从script.js 导出默认该函数?您是否从socket.js 导出export {socket, connectToChannel}?你可能错过了一些东西,因为那应该是有效的。我刚刚将这三个文件粘贴到一个空的早午餐应用程序中,它正在工作。
    • 对不起,你在回答中说我必须导出默认那个(哪个?)函数?
    • 我开始认为我可能错过了 script(connectToChannel); 应该在哪里以及如何使用...我是否只是在导入后将其添加到 app.js 中?这不是很清楚,因为您将代码添加到同一个块中,而其中一些应该位于不同的文件中......
    • 是的,它应该进入app.js。我无法拆分块,但我在app.js 开始的块中添加了注释。答案的最后一段还说让script.js 导出一个接收connectToChannel 的函数。这是实现它的一种方法。另一种可能是让 script.js 保持原样,但在顶部添加 import {connectToChannel} from "./socket"
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多