Node.js - 逐个执行函数

时间:2016-10-18 14:07:03

标签: javascript node.js

我试图逐个运行这些函数,之后它会执行第一个函数移动到第二个函数等等。现在它将同时渲染两个函数,当它结束时会占用这么多内存3000个功能。

webshot('google.com', 'google.jpeg', options, function(err) {});
webshot('yahoo.com', 'yahoo.jpeg', options, function(err) {});

2 个答案:

答案 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);
    }
});

还有一些实用程序功能,例如mapeacheachOf,可让您直接遍历您的网址列表并应用于通话:

'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
});