【发布时间】:2017-11-25 09:04:16
【问题描述】:
我的目标是从两个 URL 获取数据并仅在两个 URL 都成功返回时执行操作。另一方面,如果其中任何一个失败,我想返回一个错误。我已经玩弄了我的代码并设法获得了预期的效果。
我的问题是,是否有更有效、更简洁的方法来实现相同的功能?
辅助函数
let status = (r) => {
if (r.ok) {
return Promise.resolve(r)
} else {
return Promise.reject(new Error(r.statusText))
}
}
let json = (r) => r.json();
请求
let urls = [
'http://localhost:3000/incomplete',
'http://localhost:3000/complete'
]
let promises = urls.map(url => {
return fetch(url)
.then(status)
.then(json)
.then(d => Promise.resolve(d))
.catch(e => Promise.reject(new Error(e)));
});
Promise.all(promises).then(d => {
// do stuff with d
}).catch(e => {
console.log('Whoops something went wrong!', e);
});
【问题讨论】:
-
如果您的代码有效,那么codereview.stackexchange.com 可能是一个更好的提问地点。乍一看,
.then(d => Promise.resolve(d))和.catch(e => Promise.reject(new Error(e)));行似乎没有必要(它们不会做任何不会发生的事情)。status函数也可以是if (r.ok) { return r; } else {throw new Error(r.statusText); }。无需在不需要的地方创建承诺。 -
在你的地图函数内部不要调用“then”,喜欢的只是返回 fetch(url)
-
@FelixKling 谢谢!我不知道该网站存在!太棒了,我把那条线减少到
let promises = urls.map(url => fetch(url).then(status).then(json)); -
@PaulOkeke 如果我只是在
map中返回fetch(url),那么我如何检查我的回复是否正常? -
@Samuel 您将检查 Promises.all 中的所有响应。例如 Promises.all (promises).then(allfetch => { allfetch [0], allfetch [1].... }) 。 Promise.all 将自动调用所有 Promise 上的“then”函数,并且所有 Promise 的结果都以数组的形式返回,按照它们添加的顺序。我目前正在用手机打字……您可以查看文档。 developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
标签: javascript ajax ecmascript-6 es6-promise fetch-api