不知道nodejs 怎么让这样的循环逻辑和同步代码一样呢
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 . 完美解决