Почему этот код выдает результат 2 1, я не получаю его последовательность?

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

ты не возвращаешься из getdata, поэтому перезванивать нечего

Daniel A. White 10.08.2024 18:46
f(g()) сначала позвонит g(), потом позвонит f(). По-другому это работать не может, потому что вам нужен результат g() для вызова f(). То же самое и с вашим кодом getdata(2), который выполняется первым, потому что это необходимо.
VLAZ 10.08.2024 18:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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) и истечения времени ожидания.

Кто-нибудь может ответить на вторую часть вопроса?

dikshant gangawat 10.08.2024 20:54

Другие вопросы по теме