Promise.all解决了我希望拒绝的我的诺言数组之一

时间:2018-11-30 08:34:47

标签: javascript ecmascript-6 es6-promise

我有一个包含用于获取github用户的简单api url的promise数组。我尝试通过在数组的其中一个值中输入错误的url来使其失败,但是它始终可以解决?

在这里,我提供了我的测试用例的链接 https://jsbin.com/lapibalate/edit?js,console

let urlMap = [
  {
    url: 'https://api.github.com/users/andreepratama27',
  },
  {
    url: 'https://apiiiiiii.github.com/users/rizalfakhri12'
  }
]

let promises = urlMap.map(v => fetch(v))

Promise.all(promises)
  .then(res => console.log('RESOLVED'))
  .catch(err => console.log("REJECTED"))

2 个答案:

答案 0 :(得分:3)

这是因为您不是对指定的URL进行访存,而是对当前URL上的[object Object]进行访存(因为v属性是一个对象,而不是字符串)。更改地图以读取url属性,它将被拒绝:

let promises = urlMap.map(v => fetch(v.url))

具有更改的完整示例:

let urlMap = [
  {
    url: 'https://api.github.com/users/andreepratama27',
  },
  {
    url: 'https://apiiiiiii.github.com/users/rizalfakhri12'
  }
]

let promises = urlMap.map(v => fetch(v.url))

Promise.all(promises)
  .then(res => console.log('RESOLVED'))
  .catch(err => console.log("REJECTED"))

答案 1 :(得分:2)

来自documentation

  

提取规范与jQuery.ajax()的主要区别在于两个方面:

     

从fetch()返回的Promise不会因HTTP错误状态而拒绝   即使响应是HTTP 404或500,它也会解析   通常(将ok状态设置为false),并且只会在   网络故障或是否有任何阻止请求完成的事情。

那就是为什么。