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

2018-04-08 09:13:22 +08:00
 wilsondu

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 的操作执行无效,请问是什么原因?请教各位大神

6127 次点击
所在节点    Node.js
11 条回复
Eoss
2018-04-08 09:31:17 +08:00
Promise.all()返回的不是 promise。而是一个数组。所以没有 then 方法。
这里应该用 async/await。
yyfearth
2018-04-08 09:39:19 +08:00
楼上开玩笑呢 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 永远不会执行
Jeremial
2018-04-08 09:40:41 +08:00
代码里面你有错误情况直接 return 了, 会导致 promise 一直是 pending 状态, 当然不会执行后面的 then
klesh
2018-04-08 09:45:38 +08:00
我表示同意 @yyfearth 的说法,一楼就是瞎扯。
SourceMan
2018-04-08 09:47:38 +08:00
因为 error 没有 return
duan602728596
2018-04-08 10:05:27 +08:00
有错误的话通过 reject 将错误传出来,然后通过.catch((err)=>console.error(err))输出一下看看
rover5056
2018-04-08 10:10:35 +08:00
最后加个 catch 看下错误日志就知道了
Eoss
2018-04-08 11:10:36 +08:00
@yyfearth
我确实错了。平时用惯 const bar = await Promise.all()。
好吧。说到底还说个渣渣。
wilsondu
2018-04-08 11:23:07 +08:00
@yyfearth 找到原因了,谢谢!
wilsondu
2018-04-08 11:24:52 +08:00
一个叫 @xylitol_lin 的圈内前端大神手把手帮我解决问题了,同时感谢各位的解答
yhding
2018-05-15 10:43:09 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX