返回承诺的数组
Returning Promised Array
我有以下对象,存储在变量 ($gameSystem._ipLookupJSON
) 中:
{
"www.geoplugin.net/json.gp?jsoncallback=?": {
"IP": "geoplugin_request",
"Country": "geoplugin_countryCode",
"City": "geoplugin_city"
},
"gd.geobytes.com/GetCityDetails?callback=?": {
"IP": "geobytesipaddress",
"Country": "geobytescountry",
"City": "geobytescity"
},
"ip-api.com/json": {
"IP": "ip",
"Country": "country_name",
"City": "city"
},
"ipinfo.io/json": {
"IP": "ip",
"Country": "country",
"City": "city"
}
}
此对象中的每个键都是 URL。
我有一个函数 ($._findService()
):
遍历每个键并将它们发送到另一个函数
($._urlExists()
),检查 URL 是否有效/响应,
如果为真,$._findService()
创建一个仅包含键及其元素的新数组,
- 并且应该 return 这个新数组。
不幸的是,我在执行第三步时遇到问题 - returning 新数组。
我已经 Google 并尽可能多地阅读了关于 Promises, .then, and Async/Await 的内容,但我就是想不通,只是盯着这些代码行,我已经束手无策了。
const isServiceAvailable = async url_to_check => {
console.log(url_to_check);
return await subaybay.an._urlExists("http://" + url_to_check);
};
const checkServices = async(json_data) => {
return await Promise.all(Object.keys(json_data).map(url_to_check => isServiceAvailable(url_to_check)));
};
$._findService = function(json_data) {
var url_check = checkServices(json_data);
url_check.then(function(values) {
for (i = 0; i < values.length; i++) {
if (values[i] === true) {
var service_to_use = new Promise(function(resolve, reject) {
var result = [];
result.push(json_data[Object.keys(json_data)[i]]);
result.unshift(Object.keys(json_data)[i]);
resolve(result);
});
service_to_use.then(function(value) {
console.log(value);
return value;
});
};
};
});
};
我希望 $._findService()
到 return 一个数组。
可惜我得到的只是undefined
。
如果我的代码不优雅或不漂亮,我深表歉意 - 我自 2 月底以来一直在自学 JavaScript。
你的问题是你没有 return 在函数范围内做任何事情,你应该 return 承诺。
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 */ })
注意:当您 return 来自异步函数的内容时,您将获得一个承诺,因此,当您使用 await 时,您正在等待内联的承诺结果。
在 Promise 上使用 async 和 await 没有而且永远不会有任何缺点,而且它是现代的并且更好,因为您没有使用 "then" 或 [=24= 创建更多的嵌套函数]语法。
我建议对 checkServices
稍作改动。目前,输入类型是一个对象,但输出是数组的承诺。我认为 return 对象的承诺会更直观,匹配原始输入 -
// 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
没有任何优势
我有以下对象,存储在变量 ($gameSystem._ipLookupJSON
) 中:
{
"www.geoplugin.net/json.gp?jsoncallback=?": {
"IP": "geoplugin_request",
"Country": "geoplugin_countryCode",
"City": "geoplugin_city"
},
"gd.geobytes.com/GetCityDetails?callback=?": {
"IP": "geobytesipaddress",
"Country": "geobytescountry",
"City": "geobytescity"
},
"ip-api.com/json": {
"IP": "ip",
"Country": "country_name",
"City": "city"
},
"ipinfo.io/json": {
"IP": "ip",
"Country": "country",
"City": "city"
}
}
此对象中的每个键都是 URL。
我有一个函数 ($._findService()
):
遍历每个键并将它们发送到另一个函数 (
$._urlExists()
),检查 URL 是否有效/响应,如果为真,
$._findService()
创建一个仅包含键及其元素的新数组,- 并且应该 return 这个新数组。
不幸的是,我在执行第三步时遇到问题 - returning 新数组。
我已经 Google 并尽可能多地阅读了关于 Promises, .then, and Async/Await 的内容,但我就是想不通,只是盯着这些代码行,我已经束手无策了。
const isServiceAvailable = async url_to_check => {
console.log(url_to_check);
return await subaybay.an._urlExists("http://" + url_to_check);
};
const checkServices = async(json_data) => {
return await Promise.all(Object.keys(json_data).map(url_to_check => isServiceAvailable(url_to_check)));
};
$._findService = function(json_data) {
var url_check = checkServices(json_data);
url_check.then(function(values) {
for (i = 0; i < values.length; i++) {
if (values[i] === true) {
var service_to_use = new Promise(function(resolve, reject) {
var result = [];
result.push(json_data[Object.keys(json_data)[i]]);
result.unshift(Object.keys(json_data)[i]);
resolve(result);
});
service_to_use.then(function(value) {
console.log(value);
return value;
});
};
};
});
};
我希望 $._findService()
到 return 一个数组。
可惜我得到的只是undefined
。
如果我的代码不优雅或不漂亮,我深表歉意 - 我自 2 月底以来一直在自学 JavaScript。
你的问题是你没有 return 在函数范围内做任何事情,你应该 return 承诺。
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 */ })
注意:当您 return 来自异步函数的内容时,您将获得一个承诺,因此,当您使用 await 时,您正在等待内联的承诺结果。
在 Promise 上使用 async 和 await 没有而且永远不会有任何缺点,而且它是现代的并且更好,因为您没有使用 "then" 或 [=24= 创建更多的嵌套函数]语法。
我建议对 checkServices
稍作改动。目前,输入类型是一个对象,但输出是数组的承诺。我认为 return 对象的承诺会更直观,匹配原始输入 -
// 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
没有任何优势