Привет всем Надеюсь, что вы все отлично себя чувствуете,
это мой код, функция с именем и обратным вызовом, использующая имя для функции обратного вызова, чтобы вернуть имя и console.log it
Если я
function doSomething(name,callback) {
callback(name);
}
function foo(n) {
return n;
}
var val = doSomething("TEST",foo);
console.log(val);
я получил неопределенный.
Если я
function doSomething(name,callback) {
callback(name);
}
function foo(n) {
console.log(n);
}
var val = doSomething("TEST",foo);
это отлично работает и console.log имя TEST.
Так почему возвращение не работает?
Спасибо
doSomething()
ничего не возвращает, что означает, что присваивание с ней будет undefined
. Но это не проблема.
Основная проблема заключается в том, что вы, кажется, смешиваете два разных шаблона обработки данных здесь: если вы пишете чисто синхронный код, используйте функции возврата (которые сразу возвращают некоторое значение). Если вам нужен асинхронный код, используйте обратный вызов (который "в конечном итоге" что-то сделает). Смешивание этих двух шаблонов - это рецепт проблем и разочарований:
Или:
val
.Случай 1:
function doSomething(data, processor) {
return processor(data);
}
function passThrough(v) { return v; }
var val = doSomething("test", passThrough);
// immediately use "val" here in for whatever thing you need to do.
Случай 2:
function doSomething(data, callback) {
// _eventually_ a callback happens - for instance, this
// function pulls some data from a database, which is one
// of those inherently asynchronous tasks. Let fake that
// with a timeout for demonstration purposes:
setTimemout(() => callback(data), 500);
}
function handleData(val) {
// use "val" here in for whatever thing you need to do. Eventually.
}
doSomething("test", handleData);
И если вы хотите пойти с примером 2, вы действительно хотите взглянуть на "Обещания" и асинхронно/ждут в современном Javascript, которые представляют собой очень улучшенные подходы, основанные на идее "перезвонить, когда есть что-то, что можно перезвонить" ".
function doSomething(name,callback) {
callback(name);
}
function foo(n) {
console.log(n);
return n;
}
var val = doSomething("TEST",foo);
Взгляните на код выше. Когда вы вызываете doSomething, который внутренне выполняет foo, он печатает на консоли, потому что для этого используется console.log. Однако после этого утверждения он также возвращает n, который затем принимается в doSomething. Но его не возвращают. Проще говоря, то, что вы в основном делаете, это
function doSomething(name,callback) {
const returnValue = callback(name);
}
Если вы вызовете вышеуказанный метод, он вернется не определен. Чтобы вернуть правильное значение, вы должны вызвать "return returnValue". Similary вы должны сказать обратный вызов (имя)
Надеюсь это поможет.
Счастливое обучение
undefined
неявно возвращается, если у вас нет возврата в вашей функции.
когда вы вызываете var val = doSomething("TEST",foo)
, вы выравниваете возвращаемое значение doSomething to val, которое не определено.
function doSomething(name,callback) {
return callback(name);
}
function foo(n) {
return n;
}
var val = doSomething("TEST",foo);
console.log(val);
Inorder для назначения возвращаемого значения/объекта функции (в этом случае doSomething
должен иметь оператор return. Else функция ничего не возвращает, поэтому, когда вы назначаете это val
, она по-прежнему undefined
.
Поэтому вы изменяете свой код следующим образом:
function doSomething(name,callback) {
return callback(name);
}
function foo(n) {
return n;
}
var val = doSomething("TEST",foo);
console.log(val);
doSomething
ничего не возвращает ни в одном из кодов (но если выconsole.log
переменнуюn
переменнаяn
находится в области видимости, она будетreturn doSomething()
журнал) Вы хотелиreturn doSomething()
?return callback(name);