Javascript 如何访问promise中的函数参数
我有以下功能:Javascript 如何访问promise中的函数参数,javascript,function,scope,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和$aft
var makeNewContextMenu = function( metadata, $toggle, $after){
dataStore.getCollaboration(metadata._mountTarget).then(function(data){
//need to access metadata, $toggle and $after inside promise
})
}
在我的承诺内,如何访问元数据、$toggle和$after 您可以完全按照代码所示使用它们。父作用域中的变量或参数可用于内联函数,如
.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);
})
}
无法访问父作用域中定义的变量或参数的唯一原因是,如果某个介入作用域定义了同名的变量或参数。在这种情况下,距离您较近的范围具有优先权,且较高范围的变量被具有相同名称的较近范围的变量“隐藏”,如果不将其重命名为不具有相同名称,则无法访问较高范围的变量。但是,你的情况并非如此
在您的评论中,您询问了如何获取包含
元数据
、$toggle
、$after
和数据
的返回值。由于dataStore.getCollaboration()
是异步的,这意味着它的响应在将来某个时候可用,但是makeNewContextMenu()
会立即返回,因此不能从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);
});
注意,您确实不必在这个返回的数据结构中放置元数据
、$toggle
和$after
,因为它们是作为参数传递给makeNewContextMenu()
的,所以它们已经在调用makeNewContextMenu()
的范围内可用。您可以直接在那里引用它们,并使用它们的原始变量。太棒了!谢谢你的快速回复。作为后续问题,当我调用makeNewContextMenu时,如何才能返回{metadata,$toggle,$after,data}?@user5844628-从何处返回它们?比如我调用makeNewContextMenu。如何让makeNewContextMenu返回{metadata,$toggle,$after,data}作为output@user5844628-假设dataStore.getCollaboration()
是异步的,则不能<当makeNewContextMenu()
返回时,代码>数据
还不可用。它将在dataStore.getCollaboration()
调用其回调之前返回,因此data
还未知。您可以返还承诺并使用返还承诺。我会在我的答案中加上如何做到这一点。你可能想看看