У меня есть функция, которая создает объект базы данных из трех массивов. Массивы заполняются в каждом цикле, один из массивов полагается на значение в той же итерации цикла.Использование обещаний/обратных вызовов для ожидания завершения функции в javascript
Зависимый массив использует библиотеку requests и библиотеку cheerio для захвата строки для заполнения массива.
В настоящее время зависимый массив заполняется нулями, которые, как мне кажется, связаны с тем, что цикл не ожидает возврата запроса.
Я все еще участвую и хочу, чтобы это работало без прямого блокирования, чтобы сохранить асинхронность, поэтому я ищу обещания/обратные вызовы.
Это делается на стороне сервера, но из того, что я видел в документах cheerios, нет возможности обещать.
Вот что у меня есть. (getFile() - это функция, которая не заполняет массив «c», она также зависит от текущего значения, которое помещается в «b»). Я знаю, что функция getFile получает правильное значение с помощью теста журнала в консоли, поэтому проблема должна заключаться в реализации заполнения 'c'.
addToDB() - это функция, которая сохраняет значение в mongoDB, от тестирования я знаю, что объекты правильно помещаются в db, только массив c неверен.
function getInfo(path) {
$(path).each(function(i,e) {
a.push(...)
b.push(value)
c.push(getFile(value))
})
var entry = new DB...//(a,b,c)
addToDB(entry);
}
function getFile(...) {
request(fullUrl, function (err, resp, page) {
if (!err && resp.statusCode == 200) {
var $ = cheerio.load(page); // load the page
srcEp = $(this).attr("src");
return srcEp;
} // end error and status code
}); // end request
}
Я читал о обещаниях/обратных вызовах, а затем(), но мне еще нужно найти что-нибудь, что работает.
Я предполагаю, что 'addToDB()' является вашей операцией async. Если это так, то для того, чтобы помочь вам решить эту проблему, вам нужно будет показать этот код. Вот где должны произойти реальные изменения. – jfriend00
addToDB - это просто функция, которая берет массивы, которые были заполнены и сохраняет их. Таким образом, он будет иметь: var objectToMake = new ... и затем сохранение ниже этого будет (через mongodb) objectToMake.save, async, который я считаю (все еще изучая js, не уверен, если это проблема) является массив c is не заполняется, то есть каждый цикл не ждет завершения getFile – user147910
Где ваша операция async? Чего вы ждете, чтобы закончить? Ваш вопрос говорит о том, чтобы ждать чего-то, но не говорит, какую операцию ждать (и показать код для этой операции). Посылы помогают только решить проблему, если у вас есть операция async. В противном случае синхронные операции просто выполняются по порядку. – jfriend00