我正在尝试创建一个进行2个API调用的路由,第二个依赖于第一个API调用的结果,只有在满足特定条件时才需要调用。下面是我遇到的问题。
router.post('/namecheck',异步函数(req,res,next) { var name = req.body.name;var计数器=0 var domain = [] var userNamesAvailable = [] var dotcom = true var answer = '‘getDomains(checkDomains) //检查域名可用性函数getDomains (回调){ var url='https://api.ote-godaddy.com/v1/domains/available?checkType=FAST’Unirest.post(url) .headers({“授权”:"sso-key ",“内容类型”:“应用程序/json”}) .send(名称+ '.com',名称+ '.net',name + '.org‘) .end( function (response) { domains=response.body.domains console.log(domains) callback(domains) }) }function checkDomains(domains) { var d=0//如果未返回数据,则发送error if(!domains) { console.log("No data returned") return next("No data returned") } else {//Check有多少域不可用(var i=0;I< domains.length;i++) { if(domainsi.available == false){ d=d+1// .com可用的标志if(domainsi.domain == name + ' .com ') { dotcom = false }} if (d >2) { console.log("d大于1") answer = 'no‘//如果有两个域可用,其中一个是.com继续}(d>1 && dotcom =='false') { answer = 'no‘}} getUsernames(finalCheck) }函数回调(GetUsernames){ //检查网站名称的社交网站= 'facebook',‘'twitter','instagram','youtube','slack','blogger’//查看可用的用户名,让i=0 sitenames.forEach(站点名称=> { Unirest.post('https://api.namechk.com/services/check.json') .headers({ 'AUTHORIZATION':‘承载','Accept':’应用程序/vnd.api.v1+json‘,}).send({’站点‘:站点名称,用户名:名称,}).end(function(response) { if(response.body.available == false){ counter ++ } else { userNamesAvailable.push(response.body) } });i++ });Console.log(计数器) console.log(userNamesAvailable) if(i == sitenames.length){ callback(counter,dotcom) }}函数finalCheck(计数器,dotcom) { console.log('Start finalCheck') console.log(counter) console.log( dotcom ) //最终检查是不是一个名字//如果一个社交网站不可用并且if(counter == 1 && dotcom =='true') { console.log(5-counter +‘社交网站可用’)res.send(“是”);} else { res.send("no") })
发布于 2018-10-31 05:15:22
在this question上关注答案。你应该能够使用Promise
来做这件事。
您只需更改函数getUsernames
。
function getUsernames(callback) {
// Social Sites to Check
var sitenames = [
'facebook',
'twitter',
'instagram',
'youtube',
'slack',
'blogger'
];
// Check Usename availabitliy
let requests = sitenames.map((sitename) => {
return new Promise((resolve) => {
Unirest.post('https://api.namechk.com/services/check.json')
.headers({
'AUTHORIZATION': 'Bearer ',
'Accept': 'application/vnd.api.v1+json',
}).send({
'site': sitename,
username: name,
}).end(function(response) {
if (response.body.available == false){
counter++;
} else {
userNamesAvailable.push(response.body);
}
resolve();
});
});
});
Promise.all(requests).then(() => {
console.log(userNamesAvailable);
callback(counter, dotcom);
});
}
function finalCheck() {
console.log('Start finalCheck')
console.log(counter)
console.log(dotcom)
//Final Check for is a name is a go or not
//If one social site is not available and the
if (counter == 1 & dotcom == 'true') {
console.log(5 - counter + ' social sites available')
res.send("yes");
} else {
res.send("no")
}
}
请记住,javascript
中的异步函数是一个特性,而不是您应该对抗的东西(我认为您正在尝试将您的主函数声明为async function
)。首先试着理解它们,你会发现它们是一个很大的优势。
有很多关于它们的文档……async Fucntion understanding Promises
编辑:不要将您调用的全局变量作为参数发送,它们已经在被调用的函数中可用。
https://stackoverflow.com/questions/53072591
复制相似问题