在异步函数中调用异步函数 Node.Js
Async function called in a async function Node.Js
我是 Node.Js 的新手。
我想在另一个函数中进行函数调用,当一切都完成后,打印一个文件。
但是函数是异步的,所以当第一个节点结束时打印文件而不等待第二个节点..
我尝试了异步库的瀑布方法,但不是我需要的瀑布..
Async 是一个大库,有很多不同的模式,也许其中之一就是解决方案
这是代码:
request(url, function (error, response, html) {
var json_list = [];
if (!error) {
var $ = cheerio.load(html);
$('.fixed-recipe-card').each(function () {
var json = {title: "", description: "", rating: "", ingredients: [], url: ""};
json.title = $(this).children().last().children().first().text().trim();
json.description = $(this).children().last().children().first().next().children().last().text().trim();
json.rating = $(this).children().last().children().first().next().children().first().children().first().attr('data-ratingstars');
json.url = $(this).children().last().children().first().next().attr('href');
request(json.url, function (error, response, html) {
var $ = cheerio.load(html);
$('.checkList__line').filter(function () {
var ingredient = $(this).children().first().children().last().text().trim();
if (ingredient !== "Add all ingredients to list") {
console.log(ingredient);
json.ingredients.push(ingredient);
}
});
});
json_list.push(json);
});
}
fs.writeFile('output.json', JSON.stringify(json_list, null, 4), function (err) {
console.log('success');
})
res.send(JSON.stringify(json_list));
});
您可以使用 Promises:
let promises = [];
$('.fixed-recipe-card').each(function () {
var json = {title: "", description: "", rating: "", ingredients: [], url: ""};
json.title = $(this).children().last().children().first().text().trim();
json.description = $(this).children().last().children().first().next().children().last().text().trim();
json.rating = $(this).children().last().children().first().next().children().first().children().first().attr('data-ratingstars');
json.url = $(this).children().last().children().first().next().attr('href');
let p = new Promise(function(resolve, reject) {
request(json.url, function (error, response, html) {
if(error) { reject(error); } // reject promise on error
var $ = cheerio.load(html);
$('.checkList__line').filter(function () {
var ingredient = $(this).children().first().children().last().text().trim();
if (ingredient !== "Add all ingredients to list") {
console.log(ingredient);
json.ingredients.push(ingredient);
}
});
resolve(response); // promise success
});
});
promises.push(p);
});
Promise.all(promises).then(function(values) {
console.log(values);
fs.writeFile('output.json', JSON.stringify(json_list, null, 4), function (err) {
console.log('success');
})
...
});
...
使用 Promise.all,您可以在所有异步调用(作为承诺构建)都已解决后执行某些操作
检查此 link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
希望对您有所帮助
我是 Node.Js 的新手。 我想在另一个函数中进行函数调用,当一切都完成后,打印一个文件。
但是函数是异步的,所以当第一个节点结束时打印文件而不等待第二个节点..
我尝试了异步库的瀑布方法,但不是我需要的瀑布.. Async 是一个大库,有很多不同的模式,也许其中之一就是解决方案
这是代码:
request(url, function (error, response, html) {
var json_list = [];
if (!error) {
var $ = cheerio.load(html);
$('.fixed-recipe-card').each(function () {
var json = {title: "", description: "", rating: "", ingredients: [], url: ""};
json.title = $(this).children().last().children().first().text().trim();
json.description = $(this).children().last().children().first().next().children().last().text().trim();
json.rating = $(this).children().last().children().first().next().children().first().children().first().attr('data-ratingstars');
json.url = $(this).children().last().children().first().next().attr('href');
request(json.url, function (error, response, html) {
var $ = cheerio.load(html);
$('.checkList__line').filter(function () {
var ingredient = $(this).children().first().children().last().text().trim();
if (ingredient !== "Add all ingredients to list") {
console.log(ingredient);
json.ingredients.push(ingredient);
}
});
});
json_list.push(json);
});
}
fs.writeFile('output.json', JSON.stringify(json_list, null, 4), function (err) {
console.log('success');
})
res.send(JSON.stringify(json_list));
});
您可以使用 Promises:
let promises = [];
$('.fixed-recipe-card').each(function () {
var json = {title: "", description: "", rating: "", ingredients: [], url: ""};
json.title = $(this).children().last().children().first().text().trim();
json.description = $(this).children().last().children().first().next().children().last().text().trim();
json.rating = $(this).children().last().children().first().next().children().first().children().first().attr('data-ratingstars');
json.url = $(this).children().last().children().first().next().attr('href');
let p = new Promise(function(resolve, reject) {
request(json.url, function (error, response, html) {
if(error) { reject(error); } // reject promise on error
var $ = cheerio.load(html);
$('.checkList__line').filter(function () {
var ingredient = $(this).children().first().children().last().text().trim();
if (ingredient !== "Add all ingredients to list") {
console.log(ingredient);
json.ingredients.push(ingredient);
}
});
resolve(response); // promise success
});
});
promises.push(p);
});
Promise.all(promises).then(function(values) {
console.log(values);
fs.writeFile('output.json', JSON.stringify(json_list, null, 4), function (err) {
console.log('success');
})
...
});
...
使用 Promise.all,您可以在所有异步调用(作为承诺构建)都已解决后执行某些操作
检查此 link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
希望对您有所帮助