2016-01-27 5 views
1

У меня есть следующие функции:Как получить доступ к параметрам функции внутри обещание

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

Как я был бы в состоянии получить доступ к метаданным, $ тумблер, и $ после того, как в свое обещание?

+1

Возможно, вы захотите прочитать [Как работают блокировки JavaScript?] (Http://stackoverflow.com/q/111102/218196) –

ответ

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(). Вы можете просто прямо ссылаться на них там и использовать свои исходные переменные.

+0

Удивительный! Спасибо за быстрый ответ. Как следующий вопрос, как я смогу вернуть {metadata, $ toggle, $ after, data}, когда я вызываю makeNewContextMenu? – user5844628

+0

@ user5844628 - Вернуть их от чего? – jfriend00

+0

сказать, я звоню, makeNewContextMenu. Как я мог бы makeNewContextMenu возвращать {метаданные, $ toggle, $ after, data} в качестве вывода – user5844628

Смежные вопросы