我有以下功能:
var makeNewContextMenu = function( metadata, $toggle, $after){
dataStore.getCollaboration(metadata._mountTarget).then(function(data){
//need to access metadata, $toggle and $after inside promise
})
}
在我的承诺中,我如何能够访问元数据,$ toggle和$?
答案 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
,$after
和data
的返回值。由于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()
的范围内可用。您可以直接在那里引用它们并使用它们的原始变量。