javascript - 计算 Promise.all 的复杂性
问题描述
我一直在努力让这个多个异步 nodejs 请求 api 工作,但不幸的是我无法让它们工作。
Index.js 代码:
service.get(
"/restraunts",
versionRoutes({
"1.0.0": getRestrauntsList
})
);
function getRestrauntsList(req, res, next) {
console.log("Started getRestrauntsList");
file1
.appEnvironment(req, res, next)
.then(function(result) {
return file2.getRestrauntsList(req, res, next);
})
.then(function(result) {
res.status(200).send(result);
return;
})
.catch(function(errorResult) {
res.status(500).send(errorResult);
return;
});
}
文件2.js
module.exports = {
getRestrauntsList: function(req, res, next) {
console.log("getRestrauntsList started..");
var cities = [1, 2, 3, 4, 5];
let restrauntsList = [];
let urlArray = [];
var restrauntsListPromise = cities.map(function(id) {
return new Promise(function(resolve, reject) {
var options = {
method: "GET",
url: "someurl/" + id + "/restaurants",
headers: {
"AUTH-TOKEN": "TOKEN"
}
};
request(options, function(error, response, body) {
if (error) {
if ("message" in error) {
errorMsg = error.message;
var result = {
status: "error",
message: errorMsg
};
} else {
var result = {
status: "error",
message: "Resource Timeout."
};
}
reject(result);
return promise;
}
console.log(
"Response: " + JSON.stringify(response)
);
if (response.statusCode === 200 || response.statusCode === 201) {
body = JSON.parse(body);
if (body.success) {
let result = {
status: "success",
data: body.result
};
resolve(result);
} else {
let result = {
status: "error",
message: body.error
};
reject(result);
}
} else {
let result = {
status: "error",
message: body.error
};
reject(result);
}
});
});
});
console.log('restrauntsListPromise:' + JSON.stringify(restrauntsListPromise));
Promise.all(restrauntsListPromise).then(function(result) {
var content = result.map(function(restraunts) {
return restrauntsList.push(restraunts.body);
});
// res.send(content);
resolve({
restrauntsList: restrauntsList
});
return promise;
});
},
};
理想情况下,我希望得到所有 API 的响应
约束列表承诺
然后使用 Promise.all 我应该迭代所有的承诺并制定我需要的对象。
然而,我的代码的响应是
restrauntsListPromise:[{},{},{},{},{}]
进而
响应:{"statusCode":200,"body":"{\"success\":true,\"res
响应:{"statusCode":200,"body":"{\"success\":true,\"res
响应:{"statusCode":200,"body":"{\"success\":true,\"res
响应:{"statusCode":200,"body":"{\"success\":true,\"res
响应:{"statusCode":200,"body":"{\"success\":true,\"res
理想情况下应该发生的是我应该能够将所有五个 api 调用的组合结果作为单个对象传递回这里的调用承诺
.then(function(result) {
res.status(200).send(result);
return;
})
问题是getRestrauntsList方法完成执行,然后过了一段时间,我得到了 api 的响应。
解决方案
问题是 getRestrauntsList 方法完成执行,然后过了一段时间,我得到了 api 的响应。
这是因为您没有从getRestrauntsList()
.
有几个项目需要解决才能使其发挥作用
1.删除未使用的变量
回报承诺;// 在 promise.all[] 和 request() 中
没有名为 的声明变量promise
。因此,您可以将其删除。
2.访问.body
而不是.data
您正在解析为resolve({status: "success", data: body.result});
但是当您进行迭代时,您正在访问 using.body
而不是.data
. 您需要使用.data
. 此外,您可以消除restrauntsList
数组,因为您使用的是.map()
3.调用resolve()
返回值。
您不能使用resolve()
to 返回值,Promise.all[]
因为您没有使用new Promise((resolve, reject) => { ... });
. 默认情况下,promise 中的 return 将是一个 promise。所以,一个简单的回报就足够了。但是如果你想明确一点,你也可以使用返回Promise.resolve()
做出这些改变,
return Promise.all(restrauntsListPromise).then(function (result) {
return {
restrauntsList: result.map(function (restraunts) {
return restraunts.data;
})
};
//or using Promise.resolve();
// return Promise.resolve({
// restrauntsList: result.map(function (restraunts) {
// return restraunts.data;
// })
// });
});