我一直在努力使这个多个异步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;
});
}
File2.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的响应restrauntsListPromise
然后使用Promise.all,我应该迭代所有的Promise并制定所需的对象。
我的代码的响应是
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的响应。
答案 0 :(得分:1)
问题是方法getRestrauntsList完成执行,然后过了一段时间,我得到了api的响应。
这是因为您没有从getRestrauntsList()
返回承诺。
只有少数几个项目需要解决才能使其正常工作
1。删除未使用的变量
回报承诺; //都位于promise.all []和request()
没有名为promise
的声明变量。因此,您可以将其删除。
2。访问.body
而不是.data
您以resolve({status: "success", data: body.result});
的身份进行解析,但是在进行迭代时,您使用的是.body
而不是.data
。您需要使用.data
。另外,由于您使用的是restrauntsList
.map()
数组
3。调用resolve()
返回值。
您无法使用resolve()
返回Promise.all[]
内的值,因为您没有使用new Promise((resolve, reject) => { ... });
创建承诺。默认情况下,承诺内的回报就是承诺。因此,简单的回报就足够了。但是,如果您想变得明确,也可以使用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;
// })
// });
});
答案 1 :(得分:0)
您正在寻找
return Promise.all(restrauntsListPromise).then(function(result) { /*
^^^^^^ */
var contents = result.map(function(restaurants) {
return restaurants.body;
// ^^^^^^^^^^^^^^^^^^^^^^^^
});
return {restaurantsList: contents};
// ^^^^^^
});
您需要从getRestrauntsList
方法返回promise链,您应该从map
回调中返回值,而不是在数组上使用push
,并且您需要返回来自then
回调-没有resolve
函数,因为您不在new Promise
构造函数中,而您只需要回调API。