node.js - nodejs同步遍历接口10次该怎么写呢?
天蓬老师
天蓬老师 2017-04-17 15:50:04
0
5
483
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(5)
刘奇

如果你用 Node7,可以用 async/await 來寫,剛好發了博客從地獄到天堂,還有以前寫的 理解 async/await。

如果不用 Node7,Async 函式庫的 waterfall() 應該可以處理你的問題,具體參考上述第一篇部落格。 waterfall() 应该可以处理你的问题,具体参考上述第一篇博客。

也可以自己封装 Promise,然后通过 then 来处理——反正也是不能用 for 的……

并行处理再排序结果

我看了下,我觉得你这个需要可以同时异步去取 10 页的数据,取完之后按一定的标识(页码)进行排序,再按顺序来加工

const requests = Array.apply(null, { length: 10 })
    .map((n, index) => index)
    .map(page => new Promise((resolve, reject) => {
        request(`${queryStringSql}&page=${page}`, function(error, response, body) {
            if (error || response.statusCode != 200) {
                reject(error);
            } else {
                resolve({
                    page: page,
                    body: body
                });
            }
        });
    }));

Promise.all(requests)
    .then(function(results) {
        const sorted = results
            .sort((r1, r2) => r1.page - r2.page)
            .map(r => r.body);
        
        sorted.forEach(body => {
            // 这里已经按页码排好序了,该干啥干啥
        });
    });

async/await

async function doIt() {
    for (var i = 0; i < 10; i++) {
        const body = await new Promise((resolve, reject) => {
            request(`${queryStringSql}&page=${i}`, function(error, response, body) {
                if (error || response.statusCode != 200) {
                    reject(error);
                } else {
                    resolve(body);
                }
            });
        });
        console.log(body);
    }
}

doIt();

其它

Async、Q、Bluebird、co 这些库都有办法实现,但应该都不是用 for

也可以自己包裝 Promise,然後透過 then 來處理-反正也是不能用 for 的…🎜

並行處理再排序結果

🎜我看了下,我覺得你這個需要可以同時異步去取 10 頁的數據,取完之後按一定的標識(頁碼)進行排序,再按順序來加工🎜 rrreee

async/await

rrreee

其它

🎜Async、Q、Bluebird、co 這些函式庫都有辦法實現,但應該都不是用 for 迴圈。 🎜
迷茫

解決方法很多,這裡可以採用q

var Q = require('q');
var request = require('request');

var urls = [
    'http://localhost:3014/q-test/address1',
    'http//localhost:3014/q-test/address2', // this is wrong address
    'http://localhost:3014/q-test/address3',
    'done' // append a useless item
];

function createPromise(url){
    var deferred = Q.defer();
    request(url , function(err , response , body){
        if(err)
            deferred.reject(err);
        else
            deferred.resolve(body);
    });
    return deferred.promise;
}


urls.reduce(function(soFar , url){
   return soFar.then(function(data){
       if(data)
           console.log(data);
       return createPromise(url); // 返回下一个请求的promise
   } ,function(err){
       console.error(err);
       return createPromise(url);// 返回下一个请求的promise
   }) 
},Q(null));

這樣就會串列行請求urls陣列裡面的位址。

具體可以看​​這篇我寫的文章nodejs q模組

或可以採用ES6裡面的generator和co模組來實現

const rp = require('request-promise');
const co = require('co');

let urls = [
    // url1
    // url2
    // url3
];

co(function*(){
    for(let i=0; i<urls.length; ++i){
        var response = yield rp(urls[i]);
        console.log(response);
    }
})
黄舟

Promise遞歸呼叫

伊谢尔伦

reduce就夠用了。 具體自己想

迷茫

使用Bluebird的Promise.mapSeries方法即可。

var Promise = require("Bluebird");
var request = require("request");
var _ = require("underscore");

// 将request模块Promise化
Promise.promisifyAll("request");

// 生成[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var N = _.range(10);

// 依次顺序遍历N数组
Promise.mapSeries(N, function(i)
{
    return requestAsync(queryStringSql + '&page=' + i + '')
        .then(function(response, body)
        {
            if (response.statusCode == 200)
            {
                cardsList.concat(JSON.parse(body)['cards']);
            }

        });
})
.catch(function(error) {
    console.log(error);
});
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板