function getdata(id, callback) {
console.info(id);
setTimeout(() => {
if (callback) {
callback();
}
}, 2000);
}
getdata(1, getdata(2));
Я не понимаю, почему getdata(2)
здесь выполняется первым. Насколько я понимаю, сначала он должен напечатать 1
. Меня смущает, почему последовательность другая. А что если я напишу:
getdata(1, () => { getdata(2); });
Как это изменение делает последовательность 1
, а затем 2
?
А также в приведенном выше коде это getdata(1,getdata(2)); выглядит действительным, и в приведенном ниже коде обратный вызов не является ошибкой функции?
function fun(num1,num2){
let result = num1+num2;
return result;
}
function last(callback){
if (callback){
const result = callback();
console.info(result)
}
}
last(fun(1,2));
f(g())
сначала позвонит g()
, потом позвонит f()
. По-другому это работать не может, потому что вам нужен результат g()
для вызова f()
. То же самое и с вашим кодом getdata(2)
, который выполняется первым, потому что это необходимо.
Вторым аргументом getdata()
должна быть функция обратного вызова. Вы вызываете функцию напрямую, а не предоставляете ее в качестве обратного вызова.
Измените этот аргумент на анонимную функцию, которая делает то, что вы хотите.
Вы также можете упростить getdata()
, поместив if
снаружи setTimeout()
.
function getdata(id, callback) {
console.info(id)
if (callback) {
setTimeout(callback, 2000)
}
}
getdata(1, () => getdata(2));
getdata(2)
выполняется немедленно при вызове getdata(1, getdata(2))
. Это связано с тем, что аргументы в JavaScript оцениваются до вызова функции.
Чтобы гарантировать, что getdata(2)
вызывается после getdata(1)
, вам необходимо передать getdata(2)
в качестве функции обратного вызова:
function getdata(id,callback){
console.info(id)
setTimeout(()=>{
if (callback){
callback();
}
},2000)
}
getdata(1, () => {
getdata(2);
});
Передавая () => { getdata(2); }
в качестве второго аргумента getdata(1)
, вы гарантируете, что getdata(2)
будет вызываться только после завершения getdata(1)
и истечения времени ожидания.
Кто-нибудь может ответить на вторую часть вопроса?
ты не возвращаешься из
getdata
, поэтому перезванивать нечего