создать функцию обратного вызова динамического c номера - PullRequest
3 голосов
/ 19 января 2020

У меня проблема с созданием глубокого номера функции обратного вызова в javascript динамически. Например, у меня есть такая функция.

function process(value, callback) {
    console.log('process ' + value)
    callback()

}

function complete() {
    console.log('complete')
}

function running(count){
     // number process function is two
    if (count==2) {
        process('number one', function () {
            process('number two', function () {
                complete()  => // last callback is closed by complete function
         })
      })
    }

    // number process function is three
    if (count==3) {
         process('number one', function () {
             process('number two', function () {
                process('number three', function () {
                    complete() => // last callback is closed by complete function
                })
             })
        })
      }
   }  

running(3);

Вывод:

процесс номер один

процесс номер два

процесс номер три

завершено

Я хочу создать обратный вызов номера - это Dynami c и закрыт функцией завершения, без использования команды if/switch, как это сделать? спасибо

Ответы [ 3 ]

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

Вы можете использовать рекурсию, и она выйдет и запустится complete, когда значение счетчика равно нулю, в противном случае она вызовет функцию process.

function process(value, callback) {
  console.log('process ' + value)
  callback()

}

function complete() {
  console.log('complete')
}

const p = ['three', 'two', 'one']

function running(count) {
  if (count) {
    process(`number ${p[count - 1]}`, () => {
      running(count - 1)
    })
  } else {
    complete()
  }
}

running(3);
2 голосов
/ 19 января 2020

Вы можете обойтись без обратного вызова в этом случае:

var processNames = ['one', 'two', 'three'];

function process(value) {
    console.log('process ' + value);
}

function complete() {
    console.log('complete');
}

function running(count){
    for (var index = 0; index < count; index++) {
        var name = 'number ' + processNames[index];
        
        process(name);
    }
    
    complete();
}  

running(3);
2 голосов
/ 19 января 2020

Для этого вы можете использовать promises.

Я создаю три обещания, используя for loop, и помещаю их в массив. Функции resolve записывают индекс в консоль. Используйте Promise.all, чтобы выполнить их по порядку, и finally, чтобы написать завершенную.

С обещанием нам не нужно предоставлять функцию обратного вызова.

function process(value) {
    console.log('process ' + value)
}

function complete() {
    console.log('complete')
}

const textInt = ['one', 'two', 'three']
function running(count){
    const promiseArray = [];
    for (let i = 0; i < count; i++)
    {
      promiseArray[new Promise(function(){
        process(textInt[i], function(){});
      })];
    }
    
    Promise.all(promiseArray).finally(complete)
}      
  
running(3);
...