2017-11-13 31 views
0
setInterval(function(){ 

    for(i=1;i<=len;i++) 
    { 

     plug[i].getSysInfo().then(data => { 

      var json = JSON.stringify(data,undefined,2); 

      var obj = JSON.parse(json); 
      var _macadd = obj.mac; 

      plug[i].getConsumption().then(data => { 

       var json = JSON.stringify(data,undefined,2); 
       var obj = JSON.parse(json); 
       var _current = obj.current; 
       var _voltage = obj.voltage; 
       var _power = (obj.power).toPrecision(5); 
       var _total = obj.total; 
       var _err_code = obj.err_code; 
       console.log(_power); 
       //console.log(_macadd); 
       //console.log(voltage); 
       if(_power > 1800) 
       { 
        _power = 0.00; 
       } 
       // var fs = require('fs'); 
       // fs.writeFile("emeter.json", json); 

       var sql1 = "INSERT INTO emeter SET ? "; 
       var post1 = { macaddress: _macadd,current: _current,voltage: _voltage,power: _power, total: _total,err_code: _err_code}; 


       var tmp = JSON.stringify(post1,undefined,2); 
       console.log(tmp); 
       con.query(sql1, post1, function (err, result) { 
        if (err) throw err; 
        console.log("inserted"); 
       }); 

      }); 
     }); 
    } 

},30000); 

私はこれを実行している間、私はエラー 未処理の約束拒絶タイプエラーの下に取得しています: Cannot read property of 'getconsumption' of undefined.未処理の約束拒否未定義

私は1つの値でインデックスを交換する際に上記のコードはうまくいきました。 1つの値だけを取得するには、それは機能しています。 Forループでは、エラーメッセージが返されます。これを解決するのを手伝ってください。

答えて

1

forループインデックス値を非同期コールバック内で使用しようとしています。問題は、forループが既に終了した後に.then()ハンドラが呼び出されているため、forループインデックスは、使用しようとするとその終端値になります。

これを修正する方法はたくさんあります。これに

for(i=1;i<=len;i++) 

:1つの簡単な方法は、これを変更することですそれぞれが独自のコピーを維持するようにES6 letを使用して

for(let i=1;i<=len;i++) 

forループの各実行のための新しいユニークな変数を作成し、そのforループブロック内の非同期呼び出しの期間であっても、インデックス。これは、ループの各呼び出しのための新しいvalindex変数を作成します

plug.forEach(function(val, index) { 
    // use val and index here rather than plug[i] 
}); 

ES5(あなたは letを持っていない)で

、あなたは.forEach()を使用するようにループを変更することができます。

+0

ありがとうございます。私は答えを得た: –

+0

ありがとうjfriend00。私は同じをクリックした:) –

関連する問題