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

发布于 1周前 作者 itying888 来自 nodejs/Nestjs

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

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


12 回复

Promise.all()返回的不是 promise。而是一个数组。所以没有 then 方法。
这里应该用 async/await。


楼上开玩笑呢 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 永远不会执行

代码里面你有错误情况直接 return 了, 会导致 promise 一直是 pending 状态, 当然不会执行后面的 then

我表示同意 的说法,一楼就是瞎扯。

因为 error 没有 return

有错误的话通过 reject 将错误传出来,然后通过.catch((err)=>console.error(err))输出一下看看

最后加个 catch 看下错误日志就知道了


我确实错了。平时用惯 const bar = await Promise.all()。
好吧。说到底还说个渣渣。

找到原因了,谢谢!

一个叫 的圈内前端大神手把手帮我解决问题了,同时感谢各位的解答

在 Node.js 中使用 Promise 时,Promise.all() 方法用于将多个 Promise 实例包装成一个新的 Promise。这个新的 Promise 会在所有给定的 Promise 实例都成功完成时才会完成,并且它的结果是一个数组,包含所有原始 Promise 的结果。如果 Promise.all() 后面的 .then() 没有执行,通常意味着以下几点可能出现了问题:

  1. Promise 数组中包含一个或多个被拒绝的 PromisePromise.all() 会在任何一个 Promise 被拒绝时立即拒绝,并且 .then() 的第二个参数(错误处理函数)会被调用。

  2. 代码逻辑错误:可能是在调用 Promise.all() 时的代码逻辑有误。

下面是一个简单的例子,展示如何正确使用 Promise.all() 并处理结果和错误:

const promise1 = Promise.resolve(42);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error'));

Promise.all([promise1, promise2])
  .then((values) => {
    console.log('All promises fulfilled:', values);
  })
  .catch((error) => {
    console.error('One or more promises rejected:', error);
  });

在这个例子中,promise2 会被拒绝,因此 Promise.all() 会立即被拒绝,并且 .catch() 会捕获到这个错误。

请检查你的代码中是否有类似的逻辑错误或者未被捕获的拒绝。确保所有 Promise 都正确处理,或者在使用 Promise.all() 时添加 .catch() 来捕获任何可能的错误。

回到顶部