Minimalist Forum Reader
Chỉ vừa học JS hơn 1 tuần để làm cái crawler tin tức, code trên Google Apps Script, có vài vấn đề mong mọi người giải đáp:

Vấn đề mô tả ngắn gọn như sau:
- 1 mảng Rss link, 1 file Google Sheet với số Spreadsheet bằng số link
- Với mỗi link, chạy hàm async để await UrlFetch nội dung bài báo (1 rss link có các item, mỗi item có 1 link bài báo) rồi append vô Google Sheet
- Để nhanh chóng, cần chạy các async này song song, kì vọng là các async sẽ update vô Spreadsheet tương ứng cùng lúc hoặc chậm hơn nhau 1-3s chẳng hạn

Kết quả sau khi tham khảo các bài viết khác nhau:
- Dùng for loop, với mỗi i thì
promise = async ()
promises.push(promise);
out of loop
all = promise.all(promises);

- Tốc độ rõ là có cải thiện so với ném async vô for loop tuần tự, nhưng về thời gian thì:
Với mỗi link, nhận thấy cần khoảng 10s để append hết SpreadSheet, tuy nhiên thời gian ghi lại của việc append trên mỗi Spread dường như vẫn theo kiểu tuần tự dù toàn bộ async task được ignite cùng lúc
Logger có dạng như sau
task.png

FIle
2.png
1.png
3.png

Code
JavaScript:
var start = new Date().getTime();
function mainTuoiTre() {
  mainTuoitre();
}
async function mainTuoitre() {
  var urlRss = [
    "https://tuoitre.vn/rss/tin-moi-nhat.rss",
    "https://tuoitre.vn/rss/thoi-su.rss",
    "https://tuoitre.vn/rss/the-gioi.rss"
  ];
  var spreadsheetName = [
    "Tuoitre-Trangchu",
    "Tuoitre-Thoisu",
    "Tuoitre-Thegioi"
  ];
  var spreadsheetIdTuoitre = "";
  var singlePromises = [];
  for (let i = 0; i < urlRss.length; i++) {
    let promise = getHtmlContentTuoitre(urlRss[i], spreadsheetName[i], spreadsheetIdTuoitre);
    t = new Date().getTime()-start;
    Logger.log(
      "Created Promise for API call of at " + t
    );
    singlePromises.push(promise);
  }
  //singlePromises.push(getHtmlContentTuoitre(urlRss[0], spreadsheetName[0], spreadsheetIdTuoitre));
  //singlePromises.push(getHtmlContentTuoitre(urlRss[1], spreadsheetName[1], spreadsheetIdTuoitre));
  //singlePromises.push(getHtmlContentTuoitre(urlRss[2], spreadsheetName[2], spreadsheetIdTuoitre));
  t = new Date().getTime()-start;
  Logger.log("Finished adding all promises at " + t);
  let allPromises = await Promise.all(singlePromises);
  t = new Date().getTime()-start;
  Logger.log("Got the results for all promises at " + t);
  Logger.log('Done');
}
async function getHtmlContentTuoitre(url, spreadsheetNamex, spreadsheetIdx) {
  t = new Date().getTime()-start;
  Logger.log("This task created at " + t);
  let xml = await UrlFetchApp.fetch(url).getContentText();
  let document = await XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild('channel');
  var items = channel.getChildren("item");
 
  var d = new Date();
  var t = d.toLocaleTimeString();

  var spreadsheet = SpreadsheetApp.openById(spreadsheetIdx);
  var sheet = spreadsheet.getSheetByName(spreadsheetNamex);
  var range = sheet.getRange("A2:K200");
  range.clearContent();
  var cell = sheet.getRange('A2');
  sheet.setCurrentCell(cell);
 
  var contentx = "";
  for (i=0; i<items.length; i++) {   
    //Logger.log(items[i].getChildText('title'));
    var link = items[i].getChildText('link');
    var description = items[i].getChildText('description').replace(/<[^>]+>/g,""); 
    //linkList.push(link);
    //let xmlDescription = await UrlFetchApp.fetch(link).getContentText();
    //let documentDescription = await XmlService.parse(xmlDescription);
    //var rootDescription = documentDescription.getRootElement();
    //var elements = rootDescription.getDescendants();
    //Logger.log(rootDescription);
    //Logger.log(elements);
    //Logger.log(xmlDescription);
    if (description.startsWith("TTO - ") == true) {
      description = description.substr(6);
      }
    //contentx = await getContentTuoitre(link);
    sheet.appendRow([items[i].getChildText('title'), link, description, items[i].getChildText('pubDate'), t]);
    //Logger.log(contentx);
  }
  //t = new Date().getTime()-start;
  Logger.log(
      "Finished Promise for API call of at " + t
    );
}

Hay là do Google Sheet nó vậy, hay thực sự cần sửa code chỗ nào đó ?
Thanks
thím dùng promise.all thì chả thế
Thím thử test trên trình duyệt hoặc nodejs đi, google app script nó cố tình làm vậy (có khả năng), vì google script nó thuộc môi trường khác với js bình thường mà
Lần sau miêu tả công việc cần làm thì tóm gọn lại bằng ngôn ngữ lập trình, bạn kể 1 đống rác như trên đọc mệt thêm chả giúp được cái gì
mà đọc xong rồi cũng ko rõ câu hỏi của bạn là gì
Mình nghĩ vấn đề nằm ở function này sheet.appendRow, cái này hẳn là sync function, nó block IO gì trỏng rồi, nên promise để fetch data thì đã chạy xong nhưng promise.all vẫn chưa xong vì còn phải chờ thằng này chạy hết đã, mà nó block IO nên kết quả của cả cái promise.all vẫn là tuần tự.
Mình phỏng đoán thế, bác xem thêm docs và debug xem sao.
Lần sau miêu tả công việc cần làm thì tóm gọn lại bằng ngôn ngữ lập trình, bạn kể 1 đống rác như trên đọc mệt thêm chả giúp được cái gì
mà đọc xong rồi cũng ko rõ câu hỏi của bạn là gì
Giờ ném 1 đống code ra hỏi mà k mô tả vấn đề thì anh lại bắt bẻ k biết cách hỏi à ?
Mô tả vậy mà k giúp dc cái gì ?
Comment tỏ ra bố đời cái gì vậy.
via theNEXTvoz for iPhone
Anh bị vấn đề gì về đọc hiểu à ?
Anh kia comment vậy thì làm sao tôi hiểu dc cuối cùng vấn đề là gì. K ? chả lẽ lại đồng ý là hiểu à ?
Bố đời là khi nào tôi chửi hay hỏi kiểu khinh thường, còn anh học văn có thấy ai dạy dấu chấm hỏi là bố đời k ?
Tôi thấy chính câu comm này của anh bố đời đúng hơn
Mình nghĩ vấn đề nằm ở function này sheet.appendRow, cái này hẳn là sync function, nó block IO gì trỏng rồi, nên promise để fetch data thì đã chạy xong nhưng promise.all vẫn chưa xong vì còn phải chờ thằng này chạy hết đã, mà nó block IO nên kết quả của cả cái promise.all vẫn là tuần tự.
Mình phỏng đoán thế, bác xem thêm docs và debug xem sao.
Thanks. Tui có hỏi trên stackoverflow thì họ nói do js trong apps script luôn là sync nên có xài async await cũng vậy thôi
Problem solved. Thank you
Giờ ném 1 đống code ra hỏi mà k mô tả vấn đề thì anh lại bắt bẻ k biết cách hỏi à ?
Mô tả vậy mà k giúp dc cái gì ?
Mô tả toàn mấy thứ thừa thãi, câu hỏi chính thì không thấy đâu
Anh cứ việc tiếp tục như thế đi đó là việc của anh, tôi góp ý anh có nghe hay ko đó cũng là việc của anh
Ko hiểu thì tôi nói ko hiểu, chụp mũ ng khác ko trả lời được rồi bắt bẻ đó cũng là quyền của anh, anh cứ tự nhiên
Reactions: vubang153
Mô tả toàn mấy thứ thừa thãi, câu hỏi chính thì không thấy đâu
Anh cứ việc tiếp tục như thế đi đó là việc của anh, tôi góp ý anh có nghe hay ko đó cũng là việc của anh
Ko hiểu thì tôi nói ko hiểu, chụp mũ ng khác ko trả lời được rồi bắt bẻ đó cũng là quyền của anh, anh cứ tự nhiên

1. Tôi chưa chụp mũ/đội nón anh k trả lời rồi bắt bẻ, câu này anh nên dành cho anh mới đúng ( chụp mũ câu hỏi và chụp chữ "rác" lên câu hỏi của họ)
2. Thừa thãi ?. Anh chỉ ra chỗ nào thừa thải xem nào. Câu hỏi của tôi có mở bài thân bài kết bài. Còn anh có gì nào ?. 1 kết bài rằng câu hỏi tôi là rác à ?
3. Nếu tất cả các anh kia đều comm k hiểu gì thì tôi chấp nhận câu k hiểu của anh. Còn ai comm cũng chỉ mình anh đi ngược thiên hạ thì rõ là anh k hiểu thật
4. Anh thì tôi k cần chấp làm gì vì tôi biết mặt anh từ hồi forum cũ rồi, chuyên comm xỉa xói ng khác trong bài
1. Tôi chưa chụp mũ/đội nón anh k trả lời rồi bắt bẻ, câu này anh nên dành cho anh mới đúng ( chụp mũ câu hỏi và chụp chữ "rác" lên câu hỏi của họ)
2. Thừa thãi ?. Anh chỉ ra chỗ nào thừa thải xem nào. Câu hỏi của tôi có mở bài thân bài kết bài. Còn anh có gì nào ?. 1 kết bài rằng câu hỏi tôi là rác à ?
3. Nếu tất cả các anh kia đều comm k hiểu gì thì tôi chấp nhận câu k hiểu của anh. Còn ai comm cũng chỉ mình anh đi ngược thiên hạ thì rõ là anh k hiểu thật
4. Anh thì tôi k cần chấp làm gì vì tôi biết mặt anh từ hồi forum cũ rồi, chuyên comm xỉa xói ng khác trong bài
1/ Tôi không nói câu hỏi của anh là rác, tôi nói cái đống code anh đưa vào mới là "rác", nó làm "rác" câu hỏi của anh
2/ Toàn bộ đống anh post đều là thừa thãi vì tôi không thấy câu hỏi cụ thể chỗ nào.
Anh có thể post 1 đoạn code đơn giản như sau
const allPromises = []
for (i => 100) {
const res = doSomething()
allPromises .push(res)
}
await Promise.all(allPromises)
log('blabla)

func doSomething() {
for (i => 100)
log('abc', i)
await domeSomething2()
log('xyz', i)
}
=> Post cái hình chụp log => chạy không đúng ý chỗ nào, anh mong muốn điều gì => xong
Post mớ code kia chỉ tổ làm người ta phí thời gian đọc những thứ không cần thiết
3/ Họ hiểu hay ko, hay là họ đoán mò, đó là việc của họ, tôi ko quan tâm, tôi ko hiểu thì tôi nói là ko hiểu, tôi không đoán mò. Rõ ràng có cậu bạn kia trả lời promise.all 1 cách vu vơ làm anh phải "?" lại đấy, anh có hiểu cái gì không, tôi nghĩ là bạn đó cũng chỉ đoán mò câu hỏi của anh rồi trả lời đại trúng ko trúng thì thôi chứ cũng chả hiểu anh muốn gì đâu
4/ Cái này ko mang nội dung tranh luận trực tiếp, chỉ là ý kiến của anh thì như tôi đã nói, đó là việc của anh
Chả phải ngẫu nhiên cái forum cả chục nghìn comment cả chục post mà tôi vào cà khịa (như anh nghĩ) anh, tôi muốn đi cà khịa tôi ra f17 đi chửi bọn lập thớt nhảm chả sướng hơn ngồi đây đọc đống code của anh
1/ Tôi không nói câu hỏi của anh là rác, tôi nói cái đống code anh đưa vào mới là "rác", nó làm "rác" câu hỏi của anh
2/ Toàn bộ đống anh post đều là thừa thãi vì tôi không thấy câu hỏi cụ thể chỗ nào.
Anh có thể post 1 đoạn code đơn giản như sau
const allPromises = []
for (i => 100) {
const res = doSomething()
allPromises .push(res)
}
await Promise.all(allPromises)
log('blabla)

func doSomething() {
for (i => 100)
log('abc', i)
await domeSomething2()
log('xyz', i)
}
=> Post cái hình chụp log => chạy không đúng ý chỗ nào, anh mong muốn điều gì => xong
Post mớ code kia chỉ tổ làm người ta phí thời gian đọc những thứ không cần thiết
3/ Họ hiểu hay ko, hay là họ đoán mò, đó là việc của họ, tôi ko quan tâm, tôi ko hiểu thì tôi nói là ko hiểu, tôi không đoán mò
4/ Cái này ko mang nội dung tranh luận trực tiếp, chỉ là ý kiến của anh thì như tôi đã nói, đó là việc của anh
Chả phải ngẫu nhiên cái forum cả chục nghìn comment cả chục post mà tôi vào cà khịa (như anh nghĩ) anh, tôi muốn đi cà khịa tôi ra f17 đi chửi bọn lập thớt nhảm chả sướng hơn ngồi đây đọc đống code của anh

1. Tôi thấy anh đang mâu thuẫn với chính anh đấy, comm đầu thì anh bảo đống mô tả của tôi là rác, giờ thì anh nói đống code của tôi là rác
2. Câu hỏi cụ thể của tôi đây, nhiều anh đã trả lời đúng ý, chỉ có anh hoặc đọc quá nhanh/k hiểu/k hợp ý của anh
"
- Tốc độ rõ là có cải thiện so với ném async vô for loop tuần tự, nhưng về thời gian thì:
Với mỗi link, nhận thấy cần khoảng 10s để append hết SpreadSheet, tuy nhiên thời gian ghi lại của việc append trên mỗi Spread dường như vẫn theo kiểu tuần tự dù toàn bộ async task được ignite cùng lúc "
Hình chụp bao gồm log về thời gian như mô tả của tôi, để người đọc là anh/k phải anh hiểu/k hiểu
Anh có thể post 1 đoạn code đơn giản như sau
> Tôi hỏi trên code của tôi, vì chính nó có vấn đề, tôi ném cho anh 1 đống mã giả thì anh làm sao hiểu nó sai chỗ nào và tôi làm sao biết sửa chỗ nào ?

3. Tôi k thấy có bất cứ yếu tố gì trong cả câu hỏi này để k hiểu cả. Hoặc anh có thể đóng vai là tôi và ném câu hỏi mà anh cho là anh và tôi cũng hiểu dc lên đây
4. Tôi k có nhu cầu để ai vô khịa móc gì câu hỏi của tôi, tôi đi hỏi và muốn được giải đáp, anh k hợp thì k trả lời chứ tôi k có nhu cầu nhận 1 comm cà khịa nào đó của anh.
Anh bị vấn đề gì về đọc hiểu à ?
Anh kia comment vậy thì làm sao tôi hiểu dc cuối cùng vấn đề là gì. K ? chả lẽ lại đồng ý là hiểu à ?
Bố đời là khi nào tôi chửi hay hỏi kiểu khinh thường, còn anh học văn có thấy ai dạy dấu chấm hỏi là bố đời k ?
Tôi thấy chính câu comm này của anh bố đời đúng hơn
Thế anh comment 1 cái dấu ? thì người ta hiểu cái gì, gõ lấy 1 câu nói rõ hơn khó khăn với anh nhỉ
FfsqRRV.gif
Thái độ nó vừa phải thôi. Ở công ty xếp nhắn trả lời ? xem nó có đấm vào mặt + đuổi cm anh về nhà không
xjIzSG9.gif


via theNEXTvoz for iPhone
Reactions: vubang153 and confemale
Thế anh comment 1 cái dấu ? thì người ta hiểu cái gì, gõ lấy 1 câu nói rõ hơn khó khăn với anh nhỉ
FfsqRRV.gif
Thái độ nó vừa phải thôi. Ở công ty xếp nhắn trả lời ? xem nó có đấm vào mặt + đuổi cm anh về nhà không
xjIzSG9.gif


via theNEXTvoz for iPhone

Thế anh comment 1 cái dấu ? thì người ta hiểu cái gì
> Người ta sẽ hiểu rằng tôi k hiểu cái câu comm mà tôi quote, tức là của anh kia
gõ lấy 1 câu nói rõ hơn khó khăn với anh nhỉ
> Chừng nào mà cái dấu chấm hỏi k thể thay thế hết nghĩa cho câu nói thì tôi sẽ ghi ra, ? với tôi hiểu là 2 vế khác nhau, còn trong trường hợp này, tôi k hiểu câu trả lời và tôi ?
Thái độ nó vừa phải thôi. Ở công ty xếp nhắn trả lời ? xem nó có đấm vào mặt + đuổi cm anh về nhà không
> Chỉ có mình anh thái độ thôi, tôi chả chửi rủa hay xỉa xói gì ai cả, tôi k hiểu và tôi ? cho điều tôi thắc mắc
> Tôi hiểu Promises.all là gì, nhưng tôi k hiểu tại sao anh kia nói promise.all là vấn đề > đây là thứ thay cho dấu ? của tôi đây
> Vế sau thì chỉ có anh tự tưởng tượng với anh thôi, tôi đang ? với tư cách là thành viên ngang nhau, còn chừng nào với mối quan hệ rõ ràng tôi sẽ có cách hỏi khác.
Tôi cảm thấy phí thời gian với người như anh, chúc anh may mắn
Reactions: vubang153 and iahgnoh
Thanks. Tui có hỏi trên stackoverflow thì họ nói do js trong apps script luôn là sync nên có xài async await cũng vậy thôi
Problem solved. Thank you
Bác cho em xin cái link stackoverflow này với. Em cảm ơn.
đẩy cả task update data vô từng promise luôn
IYqzj0A.png
đẩy cả task update data vô từng promise luôn
IYqzj0A.png

là sao người ?
app script google thì trên stackoverflow nói k hỗ trợ async, vừa tham khảo và sửa lại code trên theo kiểu fetchAll (có async)