不知道nodejs 怎么让这样的循环逻辑和同步代码一样呢 - CNode技术社区

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

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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /