2016-05-03 11 views
1

AWSのgetObjectの応答に依存するNode.jsプロジェクトを作成しています。現在、私は必要なデータにアクセスし、変数(header)に格納することができますが、main関数で使用できるようにする方法はわかりません。Node.jsのAWS getObject呼び出しから変数を返す方法

TileStreamerS3.prototype.Init = function(filepath, index, s3config){ 
    var retval = false; 
    AWS.config.update({accessKeyId: s3config.access_key, secretAccessKey: s3config.secret_key}); 
    var blc = new BlockLibraryConfigs(); 
    var awsConfig = blc.awsConfig; 
    AWS.config.update({region: awsConfig.region}); 

    var aws = new AWS.S3(); 
    var params = { 
     Bucket: s3config.bucket, 
     Key: s3config.tile_directory + filepath, 
     Range: 'bytes=0-27' 
    }; 



aws.getObject(params, function(err, data){ 
     if(err == null){ 
      var header = bufferpack.unpack('<7I', data.Body); 
      return header; 
     } 
    }); 
}; 

header変数を返すにはどうすればよいですか?私はJQueryを使用する可能性のあるソリューションを見ましたが、私はWindows上にあり、JQueryをNodeと連携させるのに問題があります。私はそれを行うより良い方法があれば、その道を進む必要はありません。

更新:私は、非同期関数から値を返すことに関する複数の質問があることを知っています。私は私を踏み外すことは、aws.getObject()が別の機能をパラメータとして取り入れているということです。 aws.getObject()関数のパラメータである関数からheaderの値を返したいとします。さらに、私はgetObject()機能を変更するアクセス権がありません。

+0

jQueryのWebブラウザ/フロントエンドでのみ動作します。 NodeJSはサーバー/バックエンドです。彼らは一緒に働くことはできません。 –

+0

@BlazeSahlzenなぜnpmパッケージがあるのですか? https://www.npmjs.com/package/jQuery –

+0

サーバー側でHTMLデータを操作する必要がある場合は、それがあります。 –

答えて

1

非同期プログラミングについて最初に理解することは、が実際にあなたのメイン関数または他の場所にコールバックの結果を返すことができないということです。 Here's a tutorial on async coding to get you started


現在の状況については、Async Waterfallを使用して処理します。 Asyncは、次の関数(次の関数の引数として前の関数の出力を含む)を呼び出す前に、他の非同期関数が同期をとるように強制的に動作します。ここで

は一例です:何ここで起こることはasync.waterfallを使用して、我々は1アフタ - 他の同期と呼ばれるように(非同期の機能が含まれていてもよいそれぞれの)機能のリストを作成することができるということです

TileStreamerS3.prototype.Init = function(filepath, index, s3config, callback) { 
// pass a callback function as a parameter 

    var retval = false; 
    AWS.config.update({ 
     accessKeyId: s3config.access_key, 
     secretAccessKey: s3config.secret_key 
    }); 
    var blc = new BlockLibraryConfigs(); 
    var awsConfig = blc.awsConfig; 
    AWS.config.update({ region: awsConfig.region }); 

    var aws = new AWS.S3(); 
    var params = { 
     Bucket: s3config.bucket, 
     Key: s3config.tile_directory + filepath, 
     Range: 'bytes=0-27' 
    }; 

    async.waterfall([function(callback) { 

     aws.getObject(params, function(err, data) { 
      if (!err) { 
       var header = bufferpack.unpack('<7I', data.Body); 

       callback(null, header); // using this we are passing the control to the 
       // next function in the array 
      } 
     }); 

    }, function(header, callback) { // this is the function which will be called 
     // synchronously from aws.getObject's callback 

     // use the header value passed from the previous function 
     // do the next bit of asynchronous computation 

     callback(null, output_if_any); // call the next function or the final callback 

    }], callback); // attach the callback function to the async.waterfall 

    // due to the async nature of the code, anything written after the waterfall will 
    // be executed before the above code! So if you try to set any variable within the 
    // async function's callback and console.log it here, you will get undefined. 

}; 

。すべての関数が実行されると、末尾の最後のcallback関数が出力resultsで呼び出されます。今、あなたは機能TileStreamerS3.Initを呼び出すとき、あなたはこのようにそれを行う

TileStreamerS3Object.Init(filepath, index, s3config, function(err, results) { 

    if (err) { 
     // handle the error 
    } else { 
     // do whatever you want with the results 
     // and continue the processing 
    } 

}); 
+0

'TileStreamerS3.prototype.Init'の最後に、これらの結果に基づいて値を返す必要があります。 'TileStreamerS3.prototype.Init'の戻り値をどのように設定するのですか? –

+1

関数から結果を返す方法を示す例を更新しました。 –

+0

私は間違いをして申し訳ありません。関数から結果を返すことができないと言ったので、残りのコードをコールバック関数で実行する必要があります。私は例を更新しました。 –

関連する問題