Как вызвать функцию после завершения другой функции с помощью обратного вызова? - PullRequest
2 голосов
/ 31 января 2020

function one(){
    console.log(1);
}
function two(callback){
    setTimeout(()=>{
        console.log(2);
    },2000);
    callback();
}
two(one);

Когда я запускаю этот код, сначала отображается 1, а затем 2, потому что для отображения 2 требуется 2 секунды. Предположим, есть ли API вместо console.log (2) в функции два, для ответа которой требуется 2 секунды, поэтому Как я могу вызвать функцию один после завершения функции два с помощью callback (); что я могу сделать в этом случае, если я использую callback () внутри функции setTimeout, но что, если есть API, где я не использую setTimeout, и это занимает 2-3 секунды?

Ответы [ 4 ]

3 голосов
/ 31 января 2020

Даже если есть вызов api, для решения которого требуется время, вы все равно можете использовать обратный вызов так же, как вы только что сделали с примером setTimeout.

В качестве альтернативы, используйте Promise:

function two(callback) {
    new Promise(res => {
        setTimeout(() => {
            res();
        }, 2000);
    }).then(callback)
}

или с использованием синтаксиса async/await:

async function two(callback) {
    await new Promise(res => {
        setTimeout(() => {
            res();
        }, 2000);
    })
    callback();
}
1 голос
/ 31 января 2020

Вы можете использовать функцию syn c следующим образом

function two() {//this function takes 2 seconds
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}
function one(){
    console.log("one");
}
async function asyncCall() {
  console.log('calling');
  const result = await two();
 one()
  // expected output: 'resolved'
}

asyncCall();

вот ссылка ссылка

1 голос
/ 31 января 2020

Вы можете использовать Обещания:

function one(){
    console.log(1);
}

function two(){
    return new Promise((resolve, reject) => {
       setTimeout(()=>{
         console.log(2);
         resolve()
      },2000);
    })
}

two().then(() => one())
0 голосов
/ 31 января 2020

Положите callback(); внутрь setTimeout:

function one(){
    console.log(1);
}
function two(callback){
    setTimeout(()=>{
        console.log(2);
        callback();
    },2000);
    
}
two(one);
...