我试图在NodeJS中了解async / await。
我在文件中有一个函数,如下所示:
const getAccessToken = async () => {
return new Promise((resolve, reject) => {
const oauthOptions = {
method: 'POST',
url: oauthUrl,
headers: {
'Authorization': 'Basic ' + oauthToken
},
form: {
grant_type: 'client_credentials'
}
};
request(oauthOptions)
.then((err, httpResponse, body) => {
if (err) {
return reject('ERROR : ' + err);
}
return resolve(body.access_token);
})
.catch((e) => {
reject('getAccessToken ERROR : ' + e);
});
});
};
module.exports = getAccessToken;
此文件在twitter.js
文件夹
lib
在我的index.js
文件中,我有以下内容:
const getAccessToken = require('./lib/twitter');
let accessToken;
try {
accessToken = await getAccessToken();
} catch (e) {
return console.log(e);
}
console.log(accessToken);
尝试运行此代码时出错:
> accessKey = await getAccessToken();
> ^^^^^^^^^^^^^^
>
> SyntaxError: Unexpected identifier
> at createScript (vm.js:74:10)
> at Object.runInThisContext (vm.js:116:10)
> at Module._compile (module.js:533:28)
> at Object.Module._extensions..js (module.js:580:10)
> at Module.load (module.js:503:32)
> at tryModuleLoad (module.js:466:12)
> at Function.Module._load (module.js:458:3)
> at Function.Module.runMain (module.js:605:10)
> at startup (bootstrap_node.js:158:16)
> at bootstrap_node.js:575:3
我不能await
所需的功能,因为它标记为async
?
答案 0 :(得分:8)
您的代码已经正确无误。 {strong> twitter.js
中的无需更改,您有两种选择:
标有async
的函数始终返回promise。因此,你可以简单地做:
const getAccessToken = require('./lib/twitter');
getAccessToken().then(accessToken => {
console.log(accessToken);
})
所有返回承诺的函数都可以是awaited
,但您不能在async
标记函数之外使用等待。所以你也可以这样做:
const getAccessToken = require('./lib/twitter');
(async function () {
var accessToken = await getAccessToken();
console.log(accessToken);
})();
async / await关键字不会改变异步函数的行为方式。您仍然无法同步等待异步函数,您只能在异步函数内执行此操作。 Async / await只是承诺之上的语法糖。
答案 1 :(得分:4)
您走在正确的轨道上,但await
只能在内部使用异步功能。因此,您的结构会向后倾斜,并且可以通过更改一些内容轻松解决。但是我建议你忽略你的代码并进行一些结构性的改变。但这是您的代码的工作版本:
const getAccessToken = () => {
return new Promise((resolve, reject) => {
const oauthOptions = {
method: 'POST',
url: oauthUrl,
headers: {
'Authorization': 'Basic ' + oauthToken
},
form: {
grant_type: 'client_credentials'
}
};
request(oauthOptions)
.then((err, httpResponse, body) => {
if (err) {
return reject('ERROR : ' + err);
}
return resolve(body.access_token);
})
.catch((e) => {
reject('getAccessToken ERROR : ' + e);
});
});
};
module.exports = getAccessToken;
然后:
const getAccessToken = require('./lib/twitter');
(async function() {
try {
let accessToken = await getAccessToken();
console.log(accessToken);
} catch (e) {
return console.log(e);
}
})()
这是对您的代码的一个简单修复,以说明您已经倒退,并且一些结构更改是有序的。