我想编写一个从API请求令牌的应用程序。只要此令牌不可用,我就不想继续使用该应用程序的其余部分。所以它必须像一个同步HTTP请求。
我的目标是创建一个执行请求的函数,然后返回令牌,如:
var token=getToken(); //After this function has finished
makeRequest(token); //I want this function to be executed
我该怎么做?
答案 0 :(得分:5)
它根本不想同步。拥抱回调的力量:
function getToken(callback) {
//get the token here
callback(token);
};
getToken(function(token){
makeRequest(token);
});
确保makeRequest不会在getToken完成之后执行。
答案 1 :(得分:4)
我的目标是创建一个执行请求的函数,然后返回令牌
您无法创建一个返回其不具有的值的函数。你只能回复一个承诺。
然后在代码的其他部分中,您可以等待使用then处理程序来履行承诺,或者您可以使用类似的东西:
var token = await getToken();
在async function内等待该值可用,但前提是getToken()
函数返回一个promise。
例如,使用request-promise
模块,它将类似于:
var rp = require('request-promise');
function getToken() {
// this returns a promise:
return rp('http://www.example.com/some/path');
})
然后是其他一些功能:
function otherFunction() {
getToken().then(token => {
// you have your token here
}).catch(err => {
// you have some error
});
}
或者async function
这样的事情:
async function someFunction() {
try {
var token = await getToken();
// you have your token here
} catch (err) {
// you have some error
}
}
请参阅:https://www.npmjs.com/package/request-promise
请注意,async function
和await
在ECMAScript 2017草案(ECMA-262)中定义,截至2017年3月(2017年6月),该草案尚未最终确定
但是自从v7.6开始它已经在Node中可用了(如果使用--harmony
标志,它自v7.0起可用)。有关与Node版本的兼容性,请参阅:
如果您希望语法略有不同的旧版Node版本具有类似功能,则可以使用co中的Promise.coroutine或Bluebird等模块。
答案 2 :(得分:0)
通过javaScript promise:
new Promise((resolve, reject) => {
resolve(getToken());
}).then(token =>{
//do you rest of the work
makeRequest(token);
}).catch(err =>{
console.error(err)
})
答案 3 :(得分:0)
您可以使用ES6称为生成器的功能。您可以按照此article进行更深入的概念。但基本上你可以使用发电机和承诺来完成这项工作。我使用bluebird来宣传和管理生成器。
您的代码应该像下面的示例一样好。
const Promise = require('bluebird');
function getToken(){
return new Promise(resolve=>{
//Do request do get the token, then call resolve(token).
})
}
function makeRequest(token){
return new Promise(resolve=>{
//Do request do get whatever you whant passing the token, then call resolve(result).
})
}
function* doAsyncLikeSync(){
const token= yield getToken(); //After this function has finished
const result = yield makeRequest(token); //I want this function to be executed
return result;
}
Promise.coroutine(doAsyncLikeSync)()
.then(result => {
//Do something with the result
})