【问题标题】:Node.js how to pass variable reference so it's in callback functions scopeNode.js如何传递变量引用,使其在回调函数范围内
【发布时间】:2017-11-15 06:17:58
【问题描述】:

我正在尝试使用传单库创建 node.js 应用程序,但是我使用的 WMS 使用传单中不支持的基本身份验证,因此我扩展了 Tilelayer.WMS 以使用单独的请求并将其转换为base64。这一切正常,但是我对 node/javascript 还很陌生,不知道我应该如何传递对我的 tile 变量的引用,以便在以后的回调中可用。

readerLoaded(reader) {    
    console.log(reader.target.result);

    //want to be able to do something like this in here
    tile.src = reader.target.result;
},

createTile (coords, done) {
    var tile = document.createElement('img');

    //Removed non-relevant code setting up header options etc                                           
    var reader = new FileReader();
    reader.onload = this.readerLoaded;

    http.get(url, options).subscribe(
        m => {reader.readAsDataURL(m.blob());}, 
        error => {console.log(error);}
    );

    return tile;
}

如何传递对在每个 createTile 调用中创建的特定磁贴的引用,以便在随后的 readerLoaded 调用中可用?

还有一种有效的方法可以延迟 createTile 返回,直到 readerLoaded 回调完成?我知道如果我自己设计这个,它会是一个回调,它在它准备好时执行,但是因为我正在编辑一个现有的库,重写它的大部分似乎比它的价值付出更多的努力。

谢谢。

【问题讨论】:

  • reader.onload = () => { do something with tile };

标签: javascript node.js scope


【解决方案1】:

首先,您不能像为readerLoaded() 显示的那样采用现有的函数定义,并从createTile() 内“添加”一些东西到它的范围内。这不是 Javascript 中作用域的工作方式。

在函数中使变量可用的通常方法是将它们作为参数传递或在现有的父作用域中定义它们。这是一个作为参数传递的示例。

readerLoaded(reader, tile) {    
    console.log(reader.target.result);

    //want to be able to do something like this in here
    tile.src = reader.target.result;
},

createTile (coords, done) {
    var tile = document.createElement('img');

    //Removed non-relevant code setting up header options etc                                           

    var reader = new FileReader();
    reader.onload = (reader) => {
        return this.readerLoaded(reader, tile);
    }

    http.get(url, options).subscribe(m =>{reader.readAsDataURL(m.blob());}, 
                                     error=>{console.log(error);});

    return tile;
}

如果 readerLoaded 将成为对象上的方法,那么您不能在其父范围内真正定义诸如 tile 的临时变量,因为没有真正的 Javascript 语法可以做到这一点。因此,看来您最好的选择是将其作为参数传递。

【讨论】:

  • 是的,谢谢。似乎我在想这一切都错了,我真正需要的只是 reader.onload = (loadedReader) => {tile.src = loadedReader.target['result']; };感谢您的帮助!
  • @user1671538 - 是的,这行得通。我假设readerLoaded() 中有更多代码,并且需要成为对象上的方法,但如果它所做的只是一行代码,那么是的,这是最简单的方法。
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2017-06-24
  • 2011-09-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多