私はノードを使い慣れていませんし、ランダムな練習をしています。コールバックと非同期処理は私にとって初めてのことです。私はこの仕事をどのように達成できるのかを説明する助けに感謝します。コールバックが結果を返す前に関数が完了しました
私がしようとしているのは、Excelスプレッドシートから取得した行に基づいてオブジェクトを作成し、それをテーブルに追加/更新して個別に処理することです。
私が経験している問題は、ノードの初心者に共通して見られることは、同期処理の仕方を理解できていないことです。
デフォルトでは非同期で実行されるのはなぜですか?確かに、別のアクションが実行される前に何か起こってほしいと思っているのでしょうか?
これに正しく近づいていない可能性がありますか? このシナリオでは、Excelのデータセットから行を取得しています。データセットをループする際に、各行のオブジェクトを作成します。その一部は、別の関数(getAreaId)をコールバックしてarea_idを取得します。 areaCodeが渡されます。私のコンソールログでは、myOrganisationオブジェクトは常に定義されていないareaCodeを表示します。
私のコールバック関数内にconsole.logが表示されたら、正しい値が表示されます。コールバックから返された値をローカルオブジェクトに代入する最良の方法は何ですか?
私は読んだ私は非同期のようなミドルウェアを追加する必要があります。これがノードでの私の最初の試みなので、私は必要がなければ、ライブラリを追加したり、それ以上のことを複雑にしたりしたくないです。
function importData(){
var myDataSet = getExcelData();
var x = getOrganisationCode(function(existingOrgCode){
for (j=0; j<myDataSet.length; j++){
function organisationObj(orgCode, orgName, address1, areaCode){
this.orgCode = orgCode;
this.orgName = orgName;
this.address1 = address1;
//this.areaId = getAreaId(areaCode, function(area_id){ return area_id});
getAreaId(areaCode, function(area_id){ this.areaId = area_id});
}
myOrganisation = new organisationObj(myDataSet[j]['OrgCode'], myDataSet[j]['OrgName'], myDataSet[j]['orgName'], myDataSet[j]['areaCode']);
console.log(myOrganisation)
if(isNewOrg(existingOrgCode.indexOf(myOrganisation.orgCode))){
//doInsert
} else {
//doUpdate
}
}
});
}
function getExcelData(){
//This gets data from an excel spreadsheet
}
function isNewOrg(orgCode){
//Checks if orgCode is not -1 and returns true/false accordingly
}
function getOrganisationCode(callback){
//Do a DB call to return all orgCodes
//SELECT orgCode FROM tOrg
}
function getAreaId(areaCode, callback){
//Do a DB call to return an area id based on the code passed
//SELECT areaId FROM tAreas WHERE areaCode = @input_parameter
}
このチュートリアルでは、非同期関数 - > https://blog.risingstack.com/asynchronous-javascript/ –
の記述方法について説明します。「確かに、別のアクションが起こる前に何か起こってほしいときがほとんどです実行されました " - ほとんどの場合、あなたのデータベースが結果を返すのを待っていた新しいHTTP要求の受け入れを、あなたのWebサーバが止めることを望んでいません。ほとんどの場合、レスポンスを得るためにHTTPリクエストを待っている間に、ブラウザがページのユーザーインターフェイス全体をロックしたくない場合がほとんどです。 – Quentin