Đoạn js này lỗi ở đâu vậy ạ

    var listToken = [];
con.query('SELECT access_token FROM autolike ORDER BY RAND() LIMIT 10', function(err, tokenn){
	for(let k = 0; k < tokenn.length; k++){
		request('https://graph.facebook.com/me?fields=id&method=get&access_token='+tokenn[k].access_token, function(err, res, body){
			var hihi = JSON.parse(body);
			if(typeof hihi.id != 'undefined'){
				listToken.push(tokenn[k].access_token);
			}
		});
	}
});
console.log(listToken);

em chạy thì nó chỉ ra [] mảng rỗng thôi ạ, tại sao nó lại không push giá trị vào mảng nhỉ ( điều kiện if đúng nó cũng ko push ). đó là đoạn code e thắc mắc còn e require mysql với request hết rồi nha.

Là do query xử lý bất đồng bộ thôi bạn. Hay nói cách khác là khi bạn gọi console.log thì lúc này vẫn chưa xử lý xong.

Bạn thử sửa thành như này xem khác gì không:

var listToken = [];
con.query('SELECT access_token FROM autolike ORDER BY RAND() LIMIT 10', function(err, tokenn){
	for(let k = 0; k < tokenn.length; k++){
		request('https://graph.facebook.com/me?fields=id&method=get&access_token='+tokenn[k].access_token, function(err, res, body){
			var hihi = JSON.parse(body);
			if(typeof hihi.id != 'undefined'){
				listToken.push(tokenn[k].access_token);
                console.log(listToken);
			}
		});
	}
});
3 Likes

vâng em thử viết kiểu này rồi, và nó cũng log ra. nhưng mục đích của em không phải như thế. em muốn check các giá trị token hợp lệ rồi gán vào mảng listToken để sử dụng cho đoạn code phía dưới. Nhưng khi ra ngoài hàm con.query() thì listToken lại rỗng . Vậy làm sao để xử lí ạ!!!

var listToken = [];
con.query('SELECT access_token FROM autolike ORDER BY RAND() LIMIT 10', function(err, tokenn){
	for(let k = 0; k < tokenn.length; k++){
		request('https://graph.facebook.com/me?fields=id&method=get&access_token='+tokenn[k].access_token, function(err, res, body){
			var hihi = JSON.parse(body);
			if(typeof hihi.id != 'undefined'){
				listToken.push(tokenn[k].access_token);;
			}
		});
	}
});

// ra ngoài này thì listToken lại rỗng
for(let i = 0; i < listToken.length; i++){
// em muốn xử lí tiếp code với những giá trị trong mảng listToken ...
}

Đoạn code phía dưới ví dụ là thế nào?

Giả sử đoạn code phía dưới sử dụng đến listToken, em cho nó vào hàm, ví dụ:

function fn() {
  // Sử dụng listToken
}

Thì em gọi nó sau khi query xong:

var listToken = [];
con.query('SELECT access_token FROM autolike ORDER BY RAND() LIMIT 10', function(err, tokenn){
	for(let k = 0; k < tokenn.length; k++){
		request('https://graph.facebook.com/me?fields=id&method=get&access_token='+tokenn[k].access_token, function(err, res, body){
			var hihi = JSON.parse(body);
			if(typeof hihi.id != 'undefined'){
				listToken.push(tokenn[k].access_token);
                fn();
			}
		});
	}
});
4 Likes

nhưng em chỉ cần 1 giá trị trong mảng để sử dụng thôi.

var token = listToken[Math.floor(Math.random() * listToken.length)];`

em lấy random 1 giá trị gán vào token dùng cho đoạn code còn lại chứ ko cần toàn bộ giá trị của listToken,

nếu như anh viết thì em select LIMIT 10 thì hàm fn() phải chạy tới 10 lần nếu if là đúng anh ạ. không có cách nào để giá trị của mảng listToken vẫn giữ nguyên khi ra ngoài query() hay sao ạ.

cái request trên là module nào vậy em?

1 Like

https://www.npmjs.com/package/request đây anh.

liệu dùng với package này có được ko nhỉ anh https://www.npmjs.com/package/get-json

Cái này liên quan tới việc xử lý bất đồng bộ trong js. Bạn tìm hiểu từ khóa promise/callback/awsync await xem!

4 Likes

Đúng như @VuVanChung nói, cái này em có thể tham khảo về Promise.all.

Hoặc tham khảo đoạn code tương đương sau:

const promises = [];
const listToken = [];

setTimeout(() => {
	const length = 10;
	for(let k = 0; k < length; k++) {
	    const requestPromise = new Promise((resolve, reject) => {
			setTimeout(() => {
				listToken.push(k);
				resolve();
			}, 100);
        });

        promises.push(requestPromise);
	}

    Promise.all(promises).then((values) => {
      console.log(listToken.length); // -> 10
    });

}, 100);
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?