Node.js:从函数返回值,内部是异步调用

时间:2014-09-27 10:12:39

标签: javascript node.js asynchronous amazon-web-services

我正在尝试创建一个同步函数,该函数创建一个随机字符串并检查Amazon Web Service S3上是否已存在具有该名称的文件。我怎样才能使函数同步,因为它是对AWS的异步Web服务调用?如果文件名已经存在,则该函数应该再次调用(递归),直到找到可用的文件名。

var generateUniqueAWSKey = function(prefix) {
    var unique = generateRandomString(); // generates a random string
    var name = prefix + unique + '.png';
    awss3.headObject({ Bucket: 'pics', Key: name }, function(error, result) {
        if (!error) {
            unique = generateUniqueAWSKey(prefix);
        }
    });

    return unique;
};

var filename = generateUniqueAWSKey('prefix_');
// more code below using the filename

1 个答案:

答案 0 :(得分:2)

你需要开始考虑回调。我不确定哪个条件应该再次调用相同的函数,但是你的逻辑应该存在于你正在进行的异步调用的回调函数中。换句话说,您的代码应如下所示:

function generateUniqueAWSKey (prefix, callback) {
    var unique = generateRandomString(); // generates a random string
    var name = prefix + unique + '.png';
    awss3.headObject({ Bucket: 'pics', Key: name }, function(error, result) {
        if (error) {
            // error handling here
            return generateUniqueAWSKey(prefix, callback); // say you do recursion here
        }
        else {
            return callback(unique); // no need for recursion; return result 
        }
    });
};

generateUniqueAWSKey('prefix_', function (name) {
    var filename = name;
    // more code below using the filename
});