2 回答

TA贡献1825条经验 获得超4个赞
你的问题是你没有在函数范围内返回任何东西,你应该返回承诺。
const isServiceAvailable = url_to_check => subaybay.an._urlExists("http://" + url_to_check);
const checkServices = urls => Promise.all(urls.map(url_to_check => {
return {url: url_to_check,status: isServiceAvailable(url_to_check)}
}));
$._findService = async function(json_data) {
const values = await checkServices(Object.keys(json_data));
return values.filter(v => v.status).map(v => v.url);
};
然后您可以使用:
const result = await $._findService(json_data)
或者
$._findService(json_data).then(result => { /* Do something */ })
注意:当您从异步函数返回某些内容时,您将获得一个承诺,因此,当您使用 await 时,您正在等待内联的承诺结果。
在 Promise 上使用 async 和 await 没有也永远不会有任何缺点,而且它是现代和更好的,因为您没有使用“then”或“new Promise”语法创建更多嵌套函数。

TA贡献1946条经验 获得超4个赞
我建议对checkServices. 目前,输入类型是一个对象,但输出是数组的承诺。我认为返回对象的承诺会更直观,匹配原始输入 -
// old function
checkServices({ "/foo": ..., "bar": ... })
// => Promise [ true, false ]
// new function
checkServices({ "/foo": ..., "bar": ... })
// => Promise { "/foo": true, "/bar": false }
这是变化——
// old function
const checkServices = async(json_data) => {
return await Promise.all(Object.keys(json_data).map(url_to_check => isServiceAvailable(url_to_check)));
};
// new function
const checkServices = (o = {}) =>
Promise.all(
Object.keys(o).map(k =>
isServiceAvailable(k).then(v => [ k, v ])
)
)
.then(Object.fromEntries)
有了这个结果,很容易找到true一个对象的所有键 -
$._findService = (o = {}) =>
checkServices(o).then(o =>
Object.keys(o).filter(k => o[k])
)
$._findService({ "/foo": ..., "bar": ... })
// Promise [ "/foo" ]
展开下面的代码片段以在浏览器中运行此程序 -
const checkServices = (o = {}) =>
Promise.all(
Object.keys(o).map(k =>
isServiceAvailable(k).then(v => [ k, v ])
)
)
.then(Object.fromEntries)
// fake implementation for demo
const isServiceAvailable = (service = "") =>
new Promise (r =>
setTimeout (r, 1000, service === "/foo")
)
_findService = (o = {}) =>
checkServices(o).then(o =>
Object.keys(o).filter(k => o[k])
)
checkServices({ "/foo": 1, "/bar": 2 }).then(console.log, console.error)
// { "/foo": true, "/bar": false }
_findService({ "/foo": 1, "/bar": 2 }).then(console.log, console.error)
// [ "/foo" ]
async-await
在这个程序中使用没有任何好处
添加回答
举报