我试图逐个运行这些函数,之后它会执行第一个函数移动到第二个函数等等。现在它将同时渲染两个函数,当它结束时会占用这么多内存3000个功能。
webshot('google.com', 'google.jpeg', options, function(err) {});
webshot('yahoo.com', 'yahoo.jpeg', options, function(err) {});
答案 0 :(得分:3)
每个人的最后一个论点称为“回调”;工作完成后会调用它。因此,如果您想一次执行这些操作,请将调用发送到下一个内部上一个回调:
webshot('google.com', 'google.jpeg', options, function(err) {
webshot('yahoo.com', 'yahoo.jpeg', options, function(err) {});
});
当然,如果你有束这些(你提到过3000个!),那么你不仅仅是要像那样嵌套它们。我可能会创建一个你想传递它们的参数数组,然后使用一个回调循环:
function process(list, callback) {
var index = 0;
doOne();
function doOne() {
var entry = list[index++];
webshot(entry.domain, entry.img, entry.options, function(err) {
// ...error handling, etc...
if (index < list.length) {
doOne();
} else {
callback();
}
});
}
}
var webshots = [
{domain: 'google.com', img: 'google.jpeg', options: options},
{domain: 'yahoo.com', img: 'yahoo.jpeg', options: options},
// ...
];
process(webshots, function() {
// All done
});
旁注:这对Promises来说会更清晰一些。有各种各样的库可以承诺 - 如果是Node风格的回调API(比如webshot),你可能会考虑这样做。
如果你这样做,你可以处理这样的承诺:
var webshots = [
{domain: 'google.com', img: 'google.jpeg', options: options},
{domain: 'yahoo.com', img: 'yahoo.jpeg', options: options},
// ...
];
allDone = webshots.reduce(function(p, entry) {
return p.then(function() {
return promisifiedWebshot(entry.domain, entry.img, entry.options);
});
}, Promise.resolve());
allDone.then(function() {
// All done
})
.catch(function() {
// Handle error
});
答案 1 :(得分:1)
您可以使用async之类的控制流程库:
'use strict';
const async = require('async');
async.series([
(callback) => {
webshot('google.com', 'google.jpeg', options, callback);
},
(callback) => {
webshot('yahoo.com', 'yahoo.jpeg', options, callback);
}
], (error) => {
if(error) {
console.log('Error: ' + error);
}
});
还有一些实用程序功能,例如map
,each
,eachOf
,可让您直接遍历您的网址列表并应用于通话:
'use strict';
const async = require('async'),
urls = [
{url: 'google.com', img: 'google.jpeg'},
{url: 'yahoo.com', img: 'yahoo.jpeg'}
];
async.map(urls, (url, callback) => {
webshot(url.url, url.img, options, callback);
//I presumed webshot call the callback like callback(error, result)
}, (error, webshots) => {
//If a error occured, async will skip there and error will be set
//Else, webshots will be a array of all the results
});