我将异步功能用作普通的同步功能,我尝试使用await,但仍然无法正常工作。我在哪里错了?
const getScript = (url) => {
return new Promise((resolve, reject) => {
const http = require('http'),
https = require('https');
let client = http;
if (url.toString().indexOf("https") === 0) {
client = https;
}
client.get(url, (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
resolve(data);
});
}).on("error", (err) => {
reject(err);
});
});
};
async function getBody(url) {
(async (url) => {
return ("qwe" + await getScript(url));
})(url);
}
console.log(getBody('http://myurl.com/myapi'));
console.log("end");
但是它仍然不会在console.log“ end”之前加载数据。我在哪里错了? 谢谢
答案 0 :(得分:0)
异步功能不能转换为同步功能。 asynchronous 中的 a 表示它不同步。 async
可以转换为常规函数,但仍将是异步的。
异步性具有传染性。一旦为async
(基于承诺),最好坚持承诺控制流。
在某个时候应该有顶级async
函数,并且async
内部的getBody
IIFE是多余的。应该是:
async function getBody(url) {
return ("qwe" + await getScript(url));
}
(async () => {
console.log(await getBody('http://myurl.com/myapi'));
console.log("end");
})()
答案 1 :(得分:-1)
将等待不同步
jdk.nashorn.api.scripting.NashornScriptEngine scriptEngine =(NashornScriptEngine) factory.getEngineByName("nashorn");
ScriptContext context = scriptEngine.getContext();
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("x","Guest");
engine.eval("Hello, ${x}",context);
答案 2 :(得分:-1)
这是因为您没有等待结果。在执行IIFE(异步)时,它会返回一个Promise。您不是在等待IIFE解决。 因此,您应该简单地在IIFE前面添加一个等待,例如-
async function getBody(url) {
await (async (url) => { // add await before executing this function right away
return ("qwe" + await getScript(url));
})(url);
答案 3 :(得分:-2)
尝试一下(我从头开始编写代码)
async function getBody(url) {
let r = await getScript(url));
return ("qwe" + r);
}
(async () => {
let b = await getBody('http://myurl.com/myapi')
console.log(b);
console.log("end");
}) ();