跳到主要内容
CNode

不知道nodejs 怎么让这样的循环逻辑和同步代码一样呢

问答
Jjs0exp发布于 9 年前最后回复 9 年前
654940

WechatIMG33.jpeg

查看回复

回复 (6)

J
js0exp#69 年前

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

G
godghdai#59 年前
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);
});
B
brickyang#49 年前

自己用 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

S
SteveWooo#39 年前

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

X
xiedacon#29 年前

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

Z
zswnew#19 年前

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

来自酷炫的 CNodeMD

参与回复

登录后即可参与回复。登录