1
freeminder 2017-04-07 18:24:12 +08:00
再包一层
objTemp = axiosLoop(i).then((function (idx){ return function(data){ console.log(data); return axiosLoop(idx); } })(i+1)).catch(function (error) { console.log(error); }); |
2
nino 2017-04-07 18:43:50 +08:00
<script src="https://gist.github.com/yxnino/2856a4971639f81248b56ab691eeaa2c.js"></script>
|
3
AlisaDestiny 2017-04-07 18:56:27 +08:00
@freeminder 跟我第一感一样。用闭包。
|
4
bdbai 2017-04-07 21:52:20 +08:00 via Android
支持 ES6 的话,把 for 里面的 var 改成 let 。
|
5
hythyt9898 2017-04-07 22:06:32 +08:00 via iPhone
为何不用 async/await ?
|
6
ck65 2017-04-07 23:19:01 +08:00 via iPhone
比较脏难维护和扩展,但能解燃眉之急的方案:引 deasync 包,把请求封装成一个同步方法。
需要额外学习、要求特定 nodejs 版本或使用编译工具,但优雅稳定的方案: async/await 。 |
7
abcbuzhiming OP @freeminder
@AlisaDestiny @ck65 谢谢楼上各位,奋斗了一晚上,终于在重新理解 promise 模型和闭包变量作用域的基础上,按照 freeminder 的方法搞定了。折腾死了,我终于明白为啥 Promise 仅仅出来了两年就被 async/await 干掉了, 12 万分的希望 async/await 早日在前端普及吧,再也不想拿 Promise 写东西了 |
8
spritevan 2017-04-08 01:10:35 +08:00
|
9
imdoge 2017-04-08 01:34:52 +08:00
可以用 reduce 来, arr.reduce((promise, item) => { return promise.then(() => asyncReq(item)), asyncReq1()}
|
10
xieranmaya 2017-04-08 12:31:57 +08:00
[p1,p2,p3].reduce((seq,next) => seq.then(value=>next()), Promise.resolve())
说白了有点像 x = x + n 你看啊: seq = seq.then(value => task(value) 是不是很像 |
11
bdbai 2017-04-08 22:00:58 +08:00 via Android
@abcbuzhiming Promise 活的好好的,没被干掉吧。
嫌原生 Promise 不好用可以试试 bluebird 。 |
12
xieranmaya 2017-04-09 12:49:30 +08:00
@abcbuzhiming
@bdbai 说的很对, Promise 并没有“被” async/await 干掉,相反, async/await 是基于 Promise 的,如果你不深入理解 Promise ,你也不会真正理解 async/await ,事实上, async 函数的调用就是返回 Promise ,而 await 操作符后面必须是一个 Promise 对象,这意味着你要用 async/await 的时候,必须还是要自己实现一些返回 Promise 的函数 |
13
LeoEatle 2017-04-09 14:31:53 +08:00 via iPhone
最简单的处理方案就是,用 let
|