在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ node.js在循環(huán)里多次異步request請(qǐng)求數(shù)據(jù),怎么判斷所有數(shù)據(jù)已經(jīng)請(qǐng)求處

node.js在循環(huán)里多次異步request請(qǐng)求數(shù)據(jù),怎么判斷所有數(shù)據(jù)已經(jīng)請(qǐng)求處理完

var request = require('request');

var arr = [],
    start = 0,
    num = 1;
var baseUrl = 'https://api.douban.com/v2/movie/top250';
//每次拿20條數(shù)據(jù),獲取需要的信息push到數(shù)組arr里,分5次拿,一共拿100條
for (var start = 0; start < 250;) {
    var url = baseUrl + '?start=' + start + "&count=20";
    request(url, function(error, response, body) {
        var data = JSON.parse(body).subjects;
        for (var i = 0, len = data.length; i < len; i++) {
            arr.push({
                id: num++,
                title: data[i].title,
                year: data[i].year,
                average: data[i].rating.average,
                link: data[i].alt
            })
        }
    })
    start += 20;
}
console.log(arr);

setTimeout(function(){
    console.log(arr);
},2000);

如上面代碼,分5次拿數(shù)據(jù),然后放到數(shù)組里,再打印出來(lái),但是直接打印是空,等2秒再打印就有了,知道是異步請(qǐng)求的問(wèn)題,可不知道要怎么寫(xiě)才能實(shí)現(xiàn)需求。
現(xiàn)在想實(shí)現(xiàn)的是,等所有數(shù)據(jù)拿完就打印出來(lái)。

回答
編輯回答
夢(mèng)囈

5次請(qǐng)求是異步的,最好不要在后面同步的去他們的結(jié)果(比如你這里用setTimeout,雖說(shuō)強(qiáng)制異步,但不保證一定在拿完數(shù)據(jù)之后執(zhí)行),最好的辦法還是在request回調(diào)里面檢查有沒(méi)有請(qǐng)求完。
比如可以在回調(diào)使用即時(shí)函數(shù),判斷你調(diào)用次數(shù)夠沒(méi)夠。
當(dāng)然使用promise也能夠?qū)崿F(xiàn),這里只是提供另外一種實(shí)現(xiàn)。希望對(duì)你有幫助

for (var start = 0; start < 250;) {
// 利用立即執(zhí)行函數(shù)獲得當(dāng)前循壞的start值
    (function (st){
      var url = baseUrl + '?start=' + st + "&count=20";
        request(url, function(error, response, body) {
            // 省略代碼...
            
            // 執(zhí)行結(jié)束時(shí)start的值
            if(st === 249) {
            console.log(arr);
            }
        })
    })(start);
  start += 20;  
}
2017年7月18日 13:31
編輯回答
小曖昧
2017年8月21日 12:46
編輯回答
墻頭草

https://github.com/JacksonTia...

var ep = new EventProxy();
ep.after('got_file', files.length, function (list) {
  // 在所有文件的異步執(zhí)行結(jié)束后將被執(zhí)行
  // 所有文件的內(nèi)容都存在list數(shù)組中
});
for (var i = 0; i < files.length; i++) {
  fs.readFile(files[i], 'utf-8', function (err, content) {
    // 觸發(fā)結(jié)果事件
    ep.emit('got_file', content);
  });
}
2018年3月31日 19:23
編輯回答
悶騷型

請(qǐng)使用Promise

var request = require('request');

var arr   = [],
    start = 0,
    num   = 1;

var baseUrl = 'https://api.douban.com/v2/movie/top250';

function getData(start, count) {
    return new Promise(resolve => {
        var url = baseUrl + '?start=' + start + '&count=' + count;
        request(url, function (error, response, body) {
            var data = JSON.parse(body).subjects;
            for(var i = 0, len = data.length; i < len; i++) {
                arr.push({
                    id: num++,
                    title: data[i].title,
                    year: data[i].year,
                    average: data[i].rating.average,
                    link: data[i].alt
                })
            }
            resolve()
        })
    })
}

for(var promiseArr = [], i = 0; i < 5; i++) {
    promiseArr.push(getData(i * 20, 20))
}

Promise.all(promiseArr)
       .then(function () {
           console.log(arr)
       })
2017年7月23日 02:24