for循环似乎跳过一些代码

时间:2017-07-30 14:20:36

标签: javascript node.js electron

我正在运行此代码,该代码应该将已保存的网页与当前的实时版本进行比较,但似乎只对最后一个条目执行此操作:

ipcMain.on('compare', (event, arg) => {
  index.find({
    "type": "website"
  }, function(err, docs) {
    var doc;
    var data;
    for (i = 0; i < docs.length; i++) {
      console.log(doc = docs[i]);
      console.log(i);
      request('GET', doc.URL).done(function(res) {
        data = fs.readFileSync(DataPath + "/savedpages/" + doc.Name + ".html");
        console.log(data);
        console.log(res.getBody())
        if (data == res.getBody()) {
          index.update({
            _id: doc.ID
          }, {
            $set: {
              Changes: false
            }
          }, function(err, updateval) {
            if (err) throw err;
            console.log(doc.Name);
            event.sender.send('update-false', doc.Name + "-changescell")
          })
        } else {
          index.update({
            _id: doc.ID
          }, {
            $set: {
              Changes: true
            }
          }, function(err, updateval) {
            if (err) throw err;
            console.log(doc.Name);
            event.sender.send('update-true', doc.Name + "-changescell")
          })
        }
      })
    }
  })
})

输出如下:

{ Changes: false,
type: 'website',
Date: 2017-07-30T14:04:35.592Z,
Name: 'petra',
URL: 'http://petra.oldisoft.de',
_id: 'SXtHgqAWniDBAibJ' }
0
{ Changes: false,
type: 'website',
Date: 2017-07-30T14:03:26.658Z,
Name: 'heise',
URL: 'http://heise.de',
_id: 'zOc1Wnm801huVPjs' }
1
<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 
61 6e 67 3d 22 64 65 22 3e 0a 0a 3c 68 65 61 64 3e 0a 20 20 20 20 3c 74 69 
74 6c ... >
<Buffer 3c 2f 68 65 61 64 3e 0a 3c 62 6f 64 79 20 6f 6e 6c 6f 61 64 3d 27 6a 
61 76 61 73 63 72 69 70 74 3a 64 6f 63 75 6d 65 6e 74 2e 61 6e 6d 65 6c 64 
75 6e ... >
heise
<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 
61 6e 67 3d 22 64 65 22 3e 0a 0a 3c 68 65 61 64 3e 0a 20 20 20 20 3c 74 69 
74 6c ... >
<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 
61 6e 67 3d 22 64 65 22 3e 0a 0a 3c 68 65 61 64 3e 0a 20 20 20 20 3c 74 69 
74 6c ... >
heise

在我看来,代码在for循环运行时跳过了部分代码。我不明白为什么它会这样表现。

1 个答案:

答案 0 :(得分:0)

这是因为您在循环中运行异步代码。

要解决此问题,您需要通过将异步代码包装在函数中来创建闭包:

for(i = 0; i < docs.length; i++){
  console.log(doc = docs[i]);
  console.log(i);
    runAsyncCode(doc)
  }

function runAsyncCode(doc){
    request('GET', doc.URL).done(function(res) {
          data = fs.readFileSync(DataPath + "/savedpages/" + doc.Name + ".html");
          console.log(data);
          console.log(res.getBody())
          if(data == res.getBody()){
            index.update({_id: doc.ID}, {$set: {Changes:false}}, function(err, updateval){
              if(err) throw err;
              console.log(doc.Name);
              event.sender.send('update-false', doc.Name + "-changescell")
            })
          } else {
            index.update({_id: doc.ID}, {$set: {Changes:true}}, function(err, updateval){
              if(err) throw err;
              console.log(doc.Name);
              event.sender.send('update-true', doc.Name + "-changescell")
            })
          }
        })
}