Javascript promise与promise.all链接不起作用?

Javascript promise与promise.all链接不起作用?,javascript,promise,Javascript,Promise,我有以下代码。当我运行它时,在调用getQueryToShift时,在代码的第一行出现了这样一个错误“无法读取未定义的属性'then'。看来getQueryToShift没有像我预期的那样工作。使用Promise.all的正确方法是什么,以便我在第一行声明的原始承诺在执行then块中的承诺之前,等待在getQueryToShift函数中声明的承诺数组中的所有承诺得到解析 promise=getQueryToShift(hourDiff,options,map,baseBuildStart,old

我有以下代码。当我运行它时,在调用getQueryToShift时,在代码的第一行出现了这样一个错误“无法读取未定义的属性'then'。看来getQueryToShift没有像我预期的那样工作。使用Promise.all的正确方法是什么,以便我在第一行声明的原始承诺在执行then块中的承诺之前,等待在getQueryToShift函数中声明的承诺数组中的所有承诺得到解析

promise=getQueryToShift(hourDiff,options,map,baseBuildStart,oldFrom)。然后(value=>{//error在这里
//在处理作为参数传递的映射中的数据之前,请等待承诺
});
函数getQueryToShift(小时、选项、映射、baseBuildStart、oldFrom){
让承诺=[];
datasourceSrv.get(options.targets[0].datasource)。然后(ds=>{
for(设i=0;i{
push(createQueryPromise(map、baseBuildStart、result.data));
});
}
返回承诺。全部(承诺);
});
}
函数createQueryPromise(映射、baseBuildStart、数据){
返回新承诺((解决)=>{
data.forEach(数据=>{
//解析数据并将其添加到作为参数传入的映射中
})
解决();
});
}

这个问题不完整,因为
createQueryPromise()
函数本身没有意义。它根本不显示异步操作,因此没有异步操作就不需要承诺。而且,如果在
.forEach()中有一个异步操作,那么您需要协调该异步操作,但是您没有显示该函数的代码,因此我们无法帮助您解决该问题,我们需要了解该函数实际在做什么,然后才能帮助您完整正确地实现
getQueryToShift()

除此之外,还有一些其他问题需要解决:

您没有从
getQueryToShift()
返回您的承诺。更改此项:

datasourceSrv.get(options.targets[0].datasource).then(ds => {
为此:

return datasourceSrv.get(options.targets[0].datasource).then(ds => {

而且,您忽略了以下方面所回报的承诺:

ds.query(options).then(...)

因此,您的代码不会等待该操作完成。这可能是您需要在数组中收集并使用
promise.all()
的承诺,而不是您正在使用的承诺。

您的代码实现了
承诺。所有
在空数组中-您需要
返回
承诺:

function* getDays(daysDiff, oldFrom) {
  for (let i = 0; i < daysDiff - 1; i++) {
    var options = {};
    options.range.from._d = dateToMoment(oldFrom, false).add(i, 'h').toDate();
    options.range.to._d = dateToMoment(options.range.from._d, false).add(1, 'h').toDate();
    yield options;
  }
}
function getQueryToShift(hourDiff, options, map, baseBuildStart, oldFrom) {
  // return here
  return datasourceSrv.get(options.targets[0].datasource).then(ds => {
    return Promise.all(
      Array.from(getDays(daysDiff, oldFrom), option => db.query(option))
    );
  });
}

getQueryToShift
返回一些内容<代码>返回datasourceSrv.get(…)@zero298它确实通过这样做修复了错误,谢谢。但是
getQueryToShift(hourDiff,options,map,baseBuildStart,oldFrom)中的代码。然后(value=>{
createQueryPromise
中新创建的承诺中的代码之前执行。调用
resolve()时,我是否在错误的时间解析承诺
?createQueryPromise
实际上是异步的吗?它做什么?它是否接触到任何API?如果没有看到
createQueryPromise()的实际代码,就无法真正显示完整的解决方案
。如果它们中有异步操作,那么我们需要查看它。如果没有,那么根本不需要承诺。在这两种情况下,
getQueryToShift()
中的
for
循环必须根据
createQueryPromise()
的实际工作方式进行重写。
async function getQueryToShift(hourDiff, options, map, baseBuildStart, oldFrom) {
  const ds = await datasourceSrv.get(options.targets[0].datasource);
  await Promise.all(Array.from(getDays(daysDiff, oldFrom), db.query));
}