Прежде всего проблема заключается не в необходимости чего-то, а в отношении объема. То, что на самом деле происходит, как уже указывалось другими, finddata
- это асинхронная функция, означающая, что вы не знаете, в какое время в будущем будет вызван обратный вызов function (resp) {...}
, и когда val
будет чем-то отличным от null
. Чтобы решить эту проблему, вам необходимо либо пройти дополнительный обратный вызов до функции get
, либо вернуть обещание от функции get
. Более чистый подход состоял бы в том, чтобы вернуть Promise с функции get
.
x.get()
.then(() => {
// val is ready
})
или
x.get(() => {
// val is ready
})
Другая проблема, которая у вас есть, что вы не принимая во внимание то, что если finddata
вызывает ваш обратный вызов с ошибкой? Имея что-то вроде:
finddata('/', function(resp){
that.val = resp
}
Это действительно то, чего вы не хотите иметь. С кодом, который у вас есть, если finddata
вызывает ваш обратный вызов с помощью error
, то val
будет равен этой ошибке, в противном случае он будет равен null
, если finddata
соответствует лучшим методам узлов для вызова обратного вызова с null
, если ошибок не было, таких как cb(null, data)
.
Кроме того, что вы пытаетесь сделать? Есть ли необходимость в экспонировании модуля с val
? Функция get
предназначена для регулярного вызова из приложения? Если да, то зачем вводить новый модуль, просто позвоните finddata
, который я уже сам думаю.
Является ли 'finddata' асинхронным? Вы уверены, что его callback был вызван? –
Это асинхронно, и он называется –
. Первый фрагмент не будет работать так, как предполагалось, потому что ключевое слово this this в обратном вызове означает сама функция, а не весь объект, который вы хотите экспортировать. Я не вижу ничего плохого во втором подходе, так как вы проверили, установлен ли «x.val» или нет? Можете ли вы выполнить 'console.log (that)', чтобы узнать, установлен ли он? –