Javascript Node.js如何传递变量引用以使其';回调函数作用域中的s

Javascript Node.js如何传递变量引用以使其';回调函数作用域中的s,javascript,node.js,scope,Javascript,Node.js,Scope,我正在尝试使用传单库创建node.js应用程序,但是我使用的WMS使用传单中不支持的基本身份验证,因此我扩展了Tilelayer.WMS以获取具有单独请求的图像并将其转换为base64。这一切都正常工作,但是我对node/javascript基本上是新手,不知道应该如何传递对tile变量的引用,以便在稍后的回调中使用它 readerLoaded(reader) { console.log(reader.target.result); //want to be able

我正在尝试使用传单库创建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回调完成?我知道如果我自己设计这个,它将是一个回调,当它准备好的时候执行。然而,因为我正在编辑一个现有的库,重写它的大部分似乎比它的价值更大


谢谢。

首先,您不能像您为
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语法来实现这一点。因此,您在这里的最佳选择似乎是将其作为参数传递。

首先,您不能像您为
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(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=()=>{doesthingwithtile}
reader.onload=()=>{用tile做点什么}{tile.src=loadedReader.target['result'];};谢谢你的帮助@user1671538-是的,那会有用的。我假设
readerLoaded()
中有更多的代码,需要成为对象上的一个方法,但是如果它只需要一行代码,那么是的,这是最简单的方法。是的,谢谢。看来我想的全错了,我真正需要的是像reader.onload=(loadedReader)=>{tile.src=loadedReader.target['result'];};谢谢你的帮助@user1671538-是的,那会有用的。我假设
readerLoaded()
中有更多的代码,需要成为对象上的一个方法,但如果它所做的只是一行代码,那么是的,这是最简单的方法。
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;
}