Как я могу выполнить обратный вызов только после завершения передачи данных? - PullRequest
1 голос
/ 23 мая 2019

Я столкнулся с довольно раздражающей проблемой с моим кодом Javascript из-за его синхронной природы, короче говоря, проблема в том, что мне нужно выгрузить массив данных в массив.

Этот массив затем записывается непосредственно в файл JSON.

function main(callback)  {
  myarrary = [] 

  //run some SQL query via stored procedure

  for (result in query) {

    myarray.push({

      //my data is entered here
    })
  }

  let data = JSON.stringify({myarray: somedata}, null, 4)
  fs.writeFileSync('testingjson.json', data)
  callback();
}
main(another_function)

Моя проблема заключается в том, что дамп данных и обратный вызов выполняются немедленно, так как данные не передаются в файл, а 'another_function' полагается на данные, находящиеся там, поэтому они тоже не работают.

Поэтому мне нужен дамп, чтобы дождаться окончания добавления цикла myarray

Я также попытался ввести дамп и обратный вызов в цикл for, однако они выполняются на первой итерации.

Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Функционально ваш текущий код выглядит нормально, за исключением того, что вы не должны вызывать функцию как callback , если она не является асинхронной функцией.

Обратные вызовы обычно связаны сАсинхронные API.Это полезно, если вы хотите, чтобы main(...) немедленно вернулся, чтобы вы могли просто продолжить что-то еще.Поскольку это поведение по умолчанию, API имеет значение

fs.writeFile(filename, data[, options], callback)

. Таким образом, для преобразования вашей программы в асинхронное вам необходимо:

fs = require("fs");

function main(callback)  {

    // Oops. Why is query executed synchronously?

    query = sqlSync() ;

    fs.writeFile('delete.json', "Data", callback);

}

main(() => console.log("Done"))

Вы также можете преобразовать вызовы SQL в асинхронные, если ваши APIподдержите это (поскольку это операция ввода-вывода).

Как только вы освоитесь с обычными обратными вызовами, вы можете попробовать использовать promise или async-await, как упоминалось здесь .

0 голосов
/ 23 мая 2019

если у вас есть два метода, которые возвращают обратные вызовы, вы можете использовать Promise.all ([]).Здесь, в Promise.all (), вы можете написать вызовы вашей базы данных или другие функции, которые разрешают / отклоняют что-либо.Оттуда вы можете получить их в Res объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...