Return 在 Node.js 中执行作业后承诺
Return Promise after job execution in Node.js
我正在为一些监控内容创建一个小型 Node.js 应用程序。必须使用此应用程序进行以下操作:
作业调度程序(使用 node-schedule 模块)正在一段时间内从 Web 服务检索数据并将内容插入数组(以供进一步处理)。 完成工作后,promise 应该解析完整的数组,以便在我的主程序中使用它。
这是我目前的编码。通过这种编码,承诺在完成工作之前得到解决并且数组为空。你能告诉我如何解决这个问题吗?
async function dataRetrieval(start, end, rule){
let array = [];
return new Promise(function (resolve) {
schedule.scheduleJob({start: start, end: end, rule: rule}, async function (){
let data = await service.getData();
array.push(data);
});
resolve(array);
});
}
问题是您在回调完成之外解决它。您需要在回调中解决它。
像这样
async function dataRetrieval(start, end, rule){
let array = [];
return new Promise(function (resolve) {
schedule.scheduleJob({start: start, end: end, rule: rule}, async function (){
let data = await service.getData();
array.push(data);
resolve(array);
});
});
}
发生这种情况是因为 scheduleJob
是一个异步函数,并且您的 resolve
调用发生在回调之外,在作业完成之前。
您可以使用从 scheduleJob
传递给回调的 fireDate
值来检查当前执行是否是最后一次执行。如果是这样,只有到那时,您才能使用回调中的最终数据调用 resolve
:
async function dataRetrieval(start, end, rule){
let array = [];
return new Promise(function (resolve) {
schedule.scheduleJob({start: start, end: end, rule: rule}, async function (fireDate) {
let data = await service.getData();
array.push(data);
if (fireDate >= end) {
resolve(array);
}
});
});
}
我正在为一些监控内容创建一个小型 Node.js 应用程序。必须使用此应用程序进行以下操作:
作业调度程序(使用 node-schedule 模块)正在一段时间内从 Web 服务检索数据并将内容插入数组(以供进一步处理)。 完成工作后,promise 应该解析完整的数组,以便在我的主程序中使用它。
这是我目前的编码。通过这种编码,承诺在完成工作之前得到解决并且数组为空。你能告诉我如何解决这个问题吗?
async function dataRetrieval(start, end, rule){
let array = [];
return new Promise(function (resolve) {
schedule.scheduleJob({start: start, end: end, rule: rule}, async function (){
let data = await service.getData();
array.push(data);
});
resolve(array);
});
}
问题是您在回调完成之外解决它。您需要在回调中解决它。
像这样
async function dataRetrieval(start, end, rule){
let array = [];
return new Promise(function (resolve) {
schedule.scheduleJob({start: start, end: end, rule: rule}, async function (){
let data = await service.getData();
array.push(data);
resolve(array);
});
});
}
发生这种情况是因为 scheduleJob
是一个异步函数,并且您的 resolve
调用发生在回调之外,在作业完成之前。
您可以使用从 scheduleJob
传递给回调的 fireDate
值来检查当前执行是否是最后一次执行。如果是这样,只有到那时,您才能使用回调中的最终数据调用 resolve
:
async function dataRetrieval(start, end, rule){
let array = [];
return new Promise(function (resolve) {
schedule.scheduleJob({start: start, end: end, rule: rule}, async function (fireDate) {
let data = await service.getData();
array.push(data);
if (fireDate >= end) {
resolve(array);
}
});
});
}