Không gán được dữ liệu cho tham số trong vòng lặp điều kiện?



  • Đại loại em có 1 đoạn code như bên dưới, trọng tâm và cái tham số matchs ,
    Em có khai bao giờ trên đầu mà sau khi chạy qua mấy vòng for, if else bên trong em thấy nó gán được dữ lệu rùi.
    Nhưng chốt ở dưới cùng của vòng lặp for, em vẫn thấy tham số matchs là object null

    var matchs = {},
        cc = 0,
        countOrder = 0;
    
    for(var j = 0; j < list.length; j++) {
        (function (j) {
            var regex = new RegExp(list[j].keyword);
            if(domains[i].split('.')[0] == list[j].keyword) {
                getEmailByDomain(domains[i], function (d) {
                    countOrder ++;
                    list[j].countOrder = countOrder;
                    if(matchs[d.registrantEmail] == undefined || matchs[d.registrantEmail].length == 0) {
                        matchs[d.registrantEmail] = [];
                        matchs[d.registrantEmail].push(list[j]);
                    }
                    else {
                        matchs[d.registrantEmail].push(list[j]);
                    }
                });
            }
            cc++;
        })(j)
    }
    if(cc == list.length && self.matchs.length > 0) {
        console.log(matchs);
    }
    

    Thức sự thấy đau đầu với cái bất động này các bác ạ :(. Bác nào biết hướng code chỉ em với ạ, e cảm ơn!



  • chuyển
    if(cc == list.length && self.matchs.length > 0) {
    console.log(matchs);
    }
    xuống dưới dòng
    cc++
    là được


  • Global Moderator

    @Bóng-Đá-Vũ Mình nghĩ bạn lại gặp vấn đề với việc xử lý code không đồng bộ rồi. Rất có khả năng hàm này của bạn getEmailByDomain(domain, callback) đang xử lý không đồng bộ asynchronous. Bạn kiểm tra lại xem

    Để giải quyết vấn đề này bạn có thể dùng module async hoặc bluebird để sau khi các vòng lặp getEmailByDomain hoàn thành xong mới ghi kết quả ra.



  • @Bóng-Đá-Vũ k đưa đoạn

    if(cc == list.length && self.matchs.length > 0) {
        console.log(matchs);
    }
    

    ngay sau đoạn cc++ chắc cũng được :v ko thì phải xem lại getEmailByDomain và dùng async nhé.
    Nhân tiện bạn viết cái Closure trong vòng lặp kiểu ấy phí phạm quá @@



  • @hidemanvn , @Vũ , @Bờm cảm ơn các bác đã góp ý nhá, em có làm như bác Bờm mà thấy vẫn k oke :)
    Đây là hàm code getEmailByDomain các bác ạ:

    getEmailByDomain: function (domain, callback) {
            // Set DB
            DomainModel.getlist(function (err, records) {
                if(err) {
                    return false;
                }
                if(records.length > 0 && callback) {
                    callback(records[0]);
                }
                else {
                    return false;
                }
            }, {query: {domain: domain}, input: {limit: 1}
            })
        }
    

    @hidemanvn : Bác có bảo cái đóng kín vòng mặt của e phí phạm, bác chỉ cách nào xử lý oke viows đống code như của e k ạ? :) E chuyển từ PHP sang, có nhiều vấn đề liên quan đến đồng bọ với bạn nodejs js này bỡ ngỡ quá!

    *** Nhân tiện cho em hỏi format code ở forum thế nào ạ, e k thấy nút Format lúc soạn thảo nhỉ?**



  • var matchs = {},
      cc = 0,
      countOrder = 0;
    
    for (var j = 0; j < list.length; j++) {
      (function(j) {
        var regex = new RegExp(list[j].keyword);
        if (domains[i].split('.')[0] == list[j].keyword) {
          getEmailByDomain(domains[i], function(d) {
            countOrder++;
            list[j].countOrder = countOrder;
            if (matchs[d.registrantEmail] == undefined || matchs[d.registrantEmail].length == 0) {
              matchs[d.registrantEmail] = [];
              matchs[d.registrantEmail].push(list[j]);
            } else {
              matchs[d.registrantEmail].push(list[j]);
            }
            // Move c++ lên đây
            c++;
            if (cc == list.length && self.matchs.length > 0) {
              console.log(matchs);
            }
          });
        } else {
          // Thêm else để check ko thoả điều kiện
          c++;
          if (cc == list.length && self.matchs.length > 0) {
            console.log(matchs);
          }
        }
      })(j)
    }
    

    Nodejs chạy bất đồng bộ nên bạn chưa query db xong thì nó đã chạy xong vòng for rồi
    Dùng thư viện như async hoặc promise để quản lý flow cho dễ, với code đẹp dễ nhìn hơn nữa


  • Global Moderator

    @Bóng-Đá-Vũ Code format dùng markdown nhé. Bạn mần ở đây nhé :P
    https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet


Log in to reply