不知道nodejs 怎么让这样的循环逻辑和同步代码一样呢
发布于 7 年前 作者 js0exp 4892 次浏览 来自 问答

WechatIMG33.jpeg

6 回复

我感觉可以用递归代替循环, 先完成最内层循环在进行外层循环

来自酷炫的 CNodeMD

可以先把外面两个跟异步无关的循环完成,生成一个数组,然后用Promise.all完成内部循环

用generator+promise,通过yield来控制代码执行权。详见egg.js的实现方式。或者私聊我写个粗略的实现方式给你。

自己用 Promise 把 request 包装一下,然后就可以尽情地使用 async/await 了。

类似于

function requestSync(url) { return new Promise((resolve, reject) => { request(url, (err, res, body) => { if(err) return reject(err);

        return resolve({ res, body });
    });
});

} From Noder

var co=require("co")
let getPromise=v=>{
return new Promise((resolve, reject)=> {
   setTimeout(()=>{
       resolve([1,2,3,4].map(a=>{return a*v;}));
    },33);
})
};

co(function*(){ 
    let array=[1,2,3,4],_result=[];
    for (let x = 0; x < array.length; x++) {
        let result =yield getPromise(array[x]);
        console.log(result);
        for (let index = 0; index < result.length; index++) 
            _result.push(yield Promise.resolve(result[index]*10));
    }
    return _result;
}).then(a=>{
    console.dir(a);
}).catch(ex=>{
    console.dir(ex);
});

(async()=>{
    let array=[1,2,3,4],_result=[];
    for (let x = 0; x < array.length; x++) {
        let result =await getPromise(array[x]);
        console.log(result);
        for (let index = 0; index < result.length; index++) 
            _result.push(await Promise.resolve(result[index]*10));
    }
    return _result;
})().then(a=>{
    console.dir(a);
}).catch(ex=>{
    console.dir(ex);
});

感谢大家 async/await . 完美解决 untitled1.png

回到顶部