Javascript 异步请求函数永远不会完成执行
我在AWS Lambda函数中有一个函数,它可以通过AWS Cloud9中的node命令正常运行,但在Docker Lambda上本地运行时失败。有问题的函数如下所示,带有“!”前缀的console.log已成功记录。没有的不是Javascript 异步请求函数永远不会完成执行,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我在AWS Lambda函数中有一个函数,它可以通过AWS Cloud9中的node命令正常运行,但在Docker Lambda上本地运行时失败。有问题的函数如下所示,带有“!”前缀的console.log已成功记录。没有的不是 async function getCoworkerById(id) { console.log('!*several enter getCoworkerById'); return new Promise((resolve, reject) =>
async function getCoworkerById(id) {
console.log('!*several enter getCoworkerById');
return new Promise((resolve, reject) => {
console.log('!*several enter getCoworkerById Promise');
request({
url: 'https://spaces.nexudus.com/api/spaces/coworkers',
qs: {
Coworker_Id: id
},
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Basic ' + new Buffer(process.env.nexudusEmail + ':' + process.env.nexudusPassword, 'utf8').toString('base64')
}
}, (error, response, body) => {
console.log("enter getCoworkerById 2");
if (error) {
console.log("enter getCoworkerById error");
reject(error);
} else {
console.log("enter getCoworkerById response");
if (response.statusCode === 200) {
console.log('recieved 200 from getcoworkerbyid')
resolve(JSON.parse(body).Records[0]);
} else if (response.statusCode === 409) {
console.log('recieved 409 from getcoworkerbyid')
setTimeout(() => {
resolve(getCoworkerById(id));
}, response.headers['Retry-After'] * 1000);
} else {
reject(response);
}
}
});
});
}
该函数在此块中调用,请注意,我使用的是异步库:
const coworkerPromises = [];
async.eachLimit(coworkerIds, 3, (id, callback) => {
console.log('!*several enter each limit');
try {
console.log('!*several enter each limit try');
coworkerPromises.push(getCoworkerById(id));
callback();
} catch (e) {
console.log('Error getting coworker by ID: ', e);
}
});
try {
Promise.all(coworkerPromises).then(coworkers => {
console.log("Enter promise all");
console.log(coworkers[coworkers.length - 1]);
});
} catch (e) {
console.log(e);
}
这件事让我很困惑。为什么我们永远无法在没有错误或任何东西的情况下进入函数的后半部分?让我感到奇怪的是,这在Cloud9上的node中运行得非常完美(两者都使用node8.10),所以这看起来不像是一种不使用async的模式。还是我错了?我也试过了,但没有“异步”,仍然没有骰子/我认为
coworkerPromises
将在Promise.all(coworkerPromises)
处为空,因为它在异步回调async.eachLimit(coworkerIds,3,(id,callback)=>{
-所以,您应该得到console.log(“输入Promise all”)
output至少无论如何,没有调用request
callback中的console.logs这一事实看起来确实很奇怪-我想你是在使用async
库来限制速率?也许你应该使用Promise.all(coworkerPromises)。然后(…).catch(e=>console.error(e))
然后您将看到承诺是否被拒绝(而不是try/catch,因为它不会捕获承诺拒绝)。我在.push语句之后立即记录了同事的建议,以及它的长度,得到了103个承诺{}。您认为这意味着什么?我现在将尝试该捕获。