等待继续使用快递之前的木偶模块的异步回
我有一个expressjs服务器架设与后台脚本运行的木偶。木偶脚本运行,然后返回一个JSON对象,具有4个属性。这应该然后被存储在server.js变量结果(全球范围)
问题是,我的木偶脚本(通过模块调用/ require语句)没有,尽管我等待明确告诉它这样做。当调试程序没有等到我的木偶模块的完成,而不是仅仅完成该功能(app.listen)。 JSON的回报应该是通过我提供的API,而是结果是不确定的。
木偶剧本确实与内部的JSON是正确的所有变量结束。这使我相信,这个问题简直是明确脚本拒绝等待木偶的完成,阔步向前。我调试证实了这一点
CODE
在express.js
app.get('/api', (req, res) => {
try {
res.json(results);
console.log('JSON SENT'.black)
} catch(e) {
console.error(e);
res.send("SCRIPT NOT FINISHED OR FAILED");
}
});
app.listen(port, async() => {
results = await puppet.puppet('verbose');
console.log(results);
})
在puppet.js
if(testPagesLive()) {
let quoteMadeAndRetrieved;
[optileadCredits, quoteMadeAndRetrieved] = await Promise.all([optiCheck(), runQuote()]);
[quoteMade, quoteRetrieved] = quoteMadeAndRetrieved;
}
return {
sitesUp: sitesUp,
optileadCredits: optileadCredits,
quoteMade: quoteMade,
quoteRetrieved: quoteRetrieved
}
回答如下:
app.listen的第二个参数是一个回调函数,这意味着只有在应用程序中指定的端口已在侦听,它会尝试执行该功能。你所用results = await puppet.puppet('verbose');
做有数据写入延迟到变量,但端口上没有延缓听力。如果要解决这个问题,你可以使它这样的应用程序侦听的端口上的函数执行完毕后,
(async ()=> {
results = await puppet.puppet('verbose');
app.listen(port, () => {
console.log(results);
})
})()
或者只是写承诺立即返回数据到结果变量
app.get('/api', (req, res) => {
results.then(data => {
res.json(data);
console.log('JSON SENT'.black);
});
});
app.listen(port, () => {
results = puppet.puppet('verbose');
})