使用 Promise,无法执行 all()后的 then() - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wilsondu
V2EX    Node.js

使用 Promise,无法执行 all()后的 then()

  •  
  •   wilsondu 2018-04-08 09:13:22 +08:00 6525 次点击
    这是一个创建于 2774 天前的主题,其中的信息可能已经有所发展或是发生改变。

    app.get('/getips', function(req, res){ var result = {}, queue = [], i = 1; function scanWrapper(i){

     return new Promise(function(resolve, reject){ scan(ip + '.' + i, function(err, host){ if(err){ // reject(err) return } else { console.log(host,'---'); resolve(host) } }) }) } do{ queue.push(scanWrapper(i)) }while(i++ < 254) Promise.all(queue).then(function(values){ console.log(values,'......'); result.ip = values res.send(result); },function(err){ console.log(err); }) }) 

    使用 node 写了一个获取 ip 的接口,使用 Promise.all()后,then 的操作执行无效,请问是什么原因?请教各位大神

    11 条回复    2018-05-15 10:43:09 +08:00
    Eoss
        1
    Eoss  
       2018-04-08 09:31:17 +08:00 via iPhone
    Promise.all()返回的不是 promise。而是一个数组。所以没有 then 方法。
    这里应该用 async/await。
    yyfearth
        2
    yyfearth  
       2018-04-08 09:39:19 +08:00   2
    楼上开玩笑呢 Promise.all([...]) 返回的当然是一个 promise 当然有 then 方法
    是 then 里面的 values 是一个数组 是每个 promise 的结果
    async/await 完全是 promise 的语法糖 完全等价的
    用 async/await 还是 promise 纯粹是怎么写的选择 效果是一样的

    LZ 的问题是 谁叫你把 reject 给注释掉了 你如果换成 resolve 我也就不追究了
    你直接 return 是什么意思?也就是说一旦 err 了 这个 Promise 就永远 pending 它的 then 永远不会执行
    所以你再用 Promise.all 只要里面又一个 err 那么你的 then 永远不会执行
    wyntau
        3
    wyntau  
       2018-04-08 09:40:41 +08:00
    代码里面你有错误情况直接 return 了, 会导致 promise 一直是 pending 状态, 当然不会执行后面的 then
    klesh
        4
    klesh  
       2018-04-08 09:45:38 +08:00
    我表示同意 @yyfearth 的说法,一楼就是瞎扯。
    SourceMan
        5
    SourceMan  
       2018-04-08 09:47:38 +08:00 via iPhone
    因为 error 没有 return
    duan602728596
        6
    duan602728596  
       2018-04-08 10:05:27 +08:00 via iPhone
    有错误的话通过 reject 将错误传出来,然后通过.catch((err)=>console.error(err))输出一下看看
    rover5056
        7
    rover5056  
       2018-04-08 10:10:35 +08:00
    最后加个 catch 看下错误日志就知道了
    Eoss
        8
    Eoss  
       2018-04-08 11:10:36 +08:00 via iPhone
    @yyfearth
    我确实错了。平时用惯 const bar = await Promise.all()。
    好吧。说到底还说个渣渣。
    wilsondu
        9
    wilsondu  
    OP
       2018-04-08 11:23:07 +08:00
    @yyfearth 找到原因了,谢谢!
    wilsondu
        10
    wilsondu  
    OP
       2018-04-08 11:24:52 +08:00
    一个叫 @xylitol_lin 的圈内前端大神手把手帮我解决问题了,同时感谢各位的解答
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1120 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 23:21 PVG 07:21 LAX 15:21 JFK 18:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86