如何访问promise中的函数参数

时间:2016-01-27 03:12:30

标签: javascript function scope

我有以下功能:

var makeNewContextMenu = function( metadata, $toggle, $after){
    dataStore.getCollaboration(metadata._mountTarget).then(function(data){
      //need to access metadata, $toggle and $after inside promise
    })
}

在我的承诺中,我如何能够访问元数据,$ toggle和$?

1 个答案:

答案 0 :(得分:2)

您可以像代码所示完全一样使用它们。来自父作用域的变量或参数可用于内联函数,如.then()处理程序。

var makeNewContextMenu = function( metadata, $toggle, $after){
    dataStore.getCollaboration(metadata._mountTarget).then(function(data){
       // this works!
       console.log(metadata);
       console.log($toggle);
       console.log($after);
    })
}

您可能无法访问父作用域中定义的变量或参数的唯一原因是,某些干预作用域定义了同名的变量或参数。在这种情况下,更接近您的范围具有优先权,更高范围的变量是"隐藏"通过具有相同名称的更接近范围的变量,如果不将其重命名为不具有相同名称,则无法访问更高范围的变量。但是,这不是你的情况。

在评论中,您询问了如何获得包含metadata$toggle$afterdata的返回值。由于dataStore.getCollaboration()是异步的,这意味着它的响应在将来的某个时间可用,但makeNewContextMenu()立即返回,您无法直接从data返回makeNewContextMenu() }。但是,您可以返回一个承诺,并使所需的数据成为承诺的履行价值,如下所示:

var makeNewContextMenu = function( metadata, $toggle, $after){
    return dataStore.getCollaboration(metadata._mountTarget).then(function(data){
       return {
           metadata: metadata,
           $toggle: $toggle,
           $after: $after,
           data: data
       };
    })
}

makeNewContextMenu(...).then(function(info) {
    console.log(info.metadata);
    console.log(info.$toggle);
    console.log(info.$after);
    console.log(info.data);
});

注意,您真的不必将metadata$toggle$after放在此返回的数据结构中,因为它们作为参数传递给makeNewContextMenu()所以它们已经在调用makeNewContextMenu()的范围内可用。您可以直接在那里引用它们并使用它们的原始变量。