Javascript Node.js:从内部包含异步调用的函数返回值

Javascript Node.js:从内部包含异步调用的函数返回值,javascript,node.js,asynchronous,amazon-web-services,Javascript,Node.js,Asynchronous,Amazon Web Services,我正在尝试创建一个同步函数,该函数创建一个随机字符串,并检查AmazonWebServices3上是否已经有一个同名文件。我如何使函数同步,因为它内部是对AWS的异步web服务调用?如果文件名已经存在,函数应该再次调用自身(递归),直到找到可用的文件名 var generateUniqueAWSKey = function(prefix) { var unique = generateRandomString(); // generates a random string var

我正在尝试创建一个同步函数,该函数创建一个随机字符串,并检查AmazonWebServices3上是否已经有一个同名文件。我如何使函数同步,因为它内部是对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

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

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