Node.js如何传递变量引用,以便它在回调函数范围内

时间:2017-11-15 06:17:58

标签: javascript node.js scope

我试图使用传单库创建一个node.js应用程序,但是我使用的WMS使用的是基本身份验证,这在传单中是不受支持的,因此我扩展了Tilelayer .WMS以单独请求获取图像并将其转换为base64。这一切都正常工作但是我对节点/ 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回调完成为止?我知道如果我自己设计它,它就是一个在它准备就绪时执行的回调,但是因为我正在编辑一个现有的库重写它的大部分内容似乎比它值得付出更多的努力

感谢。

1 个答案:

答案 0 :(得分:0)

首先,您不能像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语法可以做到这一点。所以,看来你最好的选择是把它作为一个论点。