如何访问 promise 中的函数参数

How to access function parameters inside a promise

本文关键字:函数 参数 promise 何访问 访问      更新时间:2023-09-26

我有以下功能:

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);
    })
}

您可能无法访问父作用域中定义的变量或参数的唯一原因是某些干预作用域定义了同名的变量或参数。 在这种情况下,离您较近的作用域具有优先权,并且作用域较大的变量被同名的较近作用域变量"隐藏",如果不重命名一个不具有相同名称的变量,则无法访问作用域较大的变量。 但是,这不是你的情况。


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

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()的范围内可用。 您可以在那里直接引用它们并使用它们的原始变量。