我目前有一个 expressJS 应用程序,我正在尝试使用 getStats
函数从 API 检索信息。但是,我编写的 profile
路由似乎是多个嵌套回调。我将如何防止这种情况发生?有没有办法让它获取所有统计信息,然后在检索到所有统计信息后将它们分配给变量?
function getStats(access_token, time_range, x, callback) {
var stats = [];
var options = {
url: 'www.example.com',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
json: true
}
request(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
for (i = 0; i < body.items.length; i++) {
stats.push(body.items[i].name);
}
return callback(stats);
}
})
}
app.get('/profile', function(req, res) {
var access_token = 1234;
getStats(access_token, 's', 'x', function(a){
console.log(a);
getStats(access_token, 's', 'y', function(b){
console.log(b);
getStats(access_token, 'm', 'x', function(c){
console.log(c);
getStats(access_token, 'm', 'y', function(d){
console.log(d);
getStats(access_token, 'l', 'x', function(e){
console.log(e);
getStats(access_token, 'l', 'y', function(f){
console.log(f);
res.send(a + "\n" + b + "\n" + c + "\n" + d + "\n" + e + "\n" + f);
});
});
});
});
});
});
});
最佳答案
Promises 允许您避免像您刚刚展示的那样的回调嵌套类型。请参阅我的示例,该示例以 Promise 形式说明了您的示例:
function getStats(access_token, time_range, x, prevResult) {
return new Promise((resolve, reject) => {
if (prevResult) {
resolve([...prevResult, "test", "test", "test"]);
}
return resolve(["test", "test", "test"]);
});
}
app.get('/profile', (req, res) => {
var access_token = 1234;
getStats(access_token, 's', 'x')
.then((a) => {
console.log(a);
return getStats(access_token, 's', 'y', a);
})
.then((b) => {
console.log(b);
return getStats(access_token, 'm', 'x', b);
})
.then((c) => {
console.log(c);
return getStats(access_token, 'm', 'y', c);
})
.then((d) => {
console.log(d);
return getStats(access_token, 'l', 'x', d);
})
.then((e) => {
console.log(e);
return getStats(access_token, 'l', 'y', e);
})
.then((f) => {
console.log(f);
res.send(f.join("\n"));
});
});
如您所见,嵌套回调结构并替换为更具可读性的格式。阅读更多关于 promise 的信息 here .
甚至可以使用 Promise.all 重写以上内容,看起来更好:
function getStats(access_token, time_range, x) {
return new Promise((resolve, reject) => {
return resolve(["test", "test", "test"]);
});
}
app.get('/profile', (req, res) => {
var access_token = 1234;
Promise.all([
getStats(access_token, 's', 'x'),
getStats(access_token, 's', 'y'),
getStats(access_token, 'm', 'x'),
getStats(access_token, 'm', 'y'),
getStats(access_token, 'l', 'x'),
getStats(access_token, 'l', 'y')
]).then((values) => {
console.log(values);
res.send(values.join("\n"));
});
});
关于javascript - Node.JS - 如何转义多个嵌套回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52353152/