Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点JS嵌套Promise.all和映射逻辑不工作_Javascript_Node.js_Promise_Nested_Es6 Promise - Fatal编程技术网

Javascript 节点JS嵌套Promise.all和映射逻辑不工作

Javascript 节点JS嵌套Promise.all和映射逻辑不工作,javascript,node.js,promise,nested,es6-promise,Javascript,Node.js,Promise,Nested,Es6 Promise,我试图得到一个嵌套的承诺。所有*映射逻辑工作。当我到达getData2时,我不断得到未定义的值 exports.getData = (param1, param2) => { return getData0(param1, param2) .then(data0 => Promise.all(data0.map(e => getData1(e.id)))) .then(data1 => Promise.all(data1.map(i => get

我试图得到一个嵌套的承诺。所有*映射逻辑工作。当我到达getData2时,我不断得到未定义的值

exports.getData = (param1, param2) => {
  return getData0(param1, param2)
    .then(data0 => Promise.all(data0.map(e => getData1(e.id))))
    .then(data1 => Promise.all(data1.map(i => getData2(i.id))))
    .then(data2 => data2.map(a => getData3(a.id)))
    .catch(err => console.error(err.message));
};
附言: 1.getData0到getData1返回结构(例如{a:val1,b:val2}) 2.我认为问题在于getData的编写方式。我怀疑他们应该回报承诺。有谁能给我一个关于函数的虚拟示例,该函数返回一个结构,其中的两个元素(见上面的a和b)都是以异步方式获得的


谢谢

首先,如果您的
getData*
方法正在执行任何异步操作,那么它们应该返回
Promise
对象。(例如,用于获取数据)

getData3
可能是一个例外,因为在所有
getData3
调用完成后,似乎不需要执行任何操作。 如果不是这种情况,您可以使用与上述类似的方法来处理
getData3
。 e、 g
data2=>Promise.all(data2.map(a=>getData3(a.id))

现在让我们逐行查看代码

exports.getData = (param1, param2) => {
  return getData0(param1, param2)
    .then(data0 => Promise.all(data0.map(e => getData1(e.id))))
    // data0 here should be an Array

    .then(data1 => Promise.all(data1.map(i => getData2(i.id))))

    // 1. data1 will be an Array with results from each getData1 call
    //    mapped by index. for e.g [result1, result2, ...]
    // 2. depending on the type of result (Object/Array) from getData1
    //    you should extract `id` from `i`(result item) and then 
    //    trigger `getData2`using that `id`. I'm assuming the issue is 
    //    here. 

    .then(data2 => data2.map(a => getData3(a.id)))
    .catch(err => console.error(err.message));
};
至于
有谁能给我一个关于函数的虚拟示例,该函数返回一个结构,其中的两个元素(见上面的a和b)都是以异步方式获得的?

我认为这应该回答如下问题

首先,如果您的
getData*
方法正在执行任何异步操作,那么它们应该返回
Promise
对象。(例如,用于获取数据)

getData3
可能是一个例外,因为在所有
getData3
调用完成后,似乎不需要执行任何操作。 如果不是这种情况,您可以使用与上述类似的方法来处理
getData3
。 e、 g
data2=>Promise.all(data2.map(a=>getData3(a.id))

现在让我们逐行查看代码

exports.getData = (param1, param2) => {
  return getData0(param1, param2)
    .then(data0 => Promise.all(data0.map(e => getData1(e.id))))
    // data0 here should be an Array

    .then(data1 => Promise.all(data1.map(i => getData2(i.id))))

    // 1. data1 will be an Array with results from each getData1 call
    //    mapped by index. for e.g [result1, result2, ...]
    // 2. depending on the type of result (Object/Array) from getData1
    //    you should extract `id` from `i`(result item) and then 
    //    trigger `getData2`using that `id`. I'm assuming the issue is 
    //    here. 

    .then(data2 => data2.map(a => getData3(a.id)))
    .catch(err => console.error(err.message));
};
至于
有谁能给我一个关于函数的虚拟示例,该函数返回一个结构,其中的两个元素(见上面的a和b)都是以异步方式获得的?

我相信这应该可以回答

我已经将Dhruv的答案标记为有效答案,因为它解释了我描述的逻辑中涉及的不同概念

getData1和getData2确实在getData3处于同步状态时调用异步函数(在我的示例中为:DoSomeNewsWork)

function doSomeEWSwork(param) {

  var ewsFunction = '.....';
  var ewsArgs = ....;

  return ews.run(ewsFunction, ewsArgs)
    .then(result => result.something)
    .catch(err => console.log(err.message));
}
我以前的getData1和getData2用于返回结构对象(例如,{a:val1,b:val2}),而不是Promission(Promise.all需要)。这导致异步bloc永远不会执行/计算

我的新getData1和getData2具有以下框架:

function getData1_or_2(param) {

  var promise = new Promise(function(resolve, reject) {
    doSomeEWSwork(param) // <- important: settle this using 'then'
    .then(res => {
      var ret = { a: res.val1, b: res.val2 };
      resolve(ret);
    }).catch(err => {
      console.log(err.message);
      reject(Error(err.message));
    });
  });
  return promise;
}
只是嵌套承诺、映射和结构对象的组合让我感到困惑。
谢谢!

我已经将Dhruv的答案标记为有效答案,因为它解释了我描述的逻辑中涉及的不同概念

getData1和getData2确实在getData3处于同步状态时调用异步函数(在我的示例中为:DoSomeNewsWork)

function doSomeEWSwork(param) {

  var ewsFunction = '.....';
  var ewsArgs = ....;

  return ews.run(ewsFunction, ewsArgs)
    .then(result => result.something)
    .catch(err => console.log(err.message));
}
我以前的getData1和getData2用于返回结构对象(例如,{a:val1,b:val2}),而不是Promission(Promise.all需要)。这导致异步bloc永远不会执行/计算

我的新getData1和getData2具有以下框架:

function getData1_or_2(param) {

  var promise = new Promise(function(resolve, reject) {
    doSomeEWSwork(param) // <- important: settle this using 'then'
    .then(res => {
      var ret = { a: res.val1, b: res.val2 };
      resolve(ret);
    }).catch(err => {
      console.log(err.message);
      reject(Error(err.message));
    });
  });
  return promise;
}
只是嵌套承诺、映射和结构对象的组合让我感到困惑。
谢谢!

getData1()
getData2()
getData3()
异步操作吗?如果是这样,它们应该返回一个承诺,在异步操作完成时,该承诺将与结果一起解析。还很奇怪为什么您使用
promise.all()
data0.map()
data1.map()
,但不能使用
data2.map()
。如果它们不是异步操作,则无需使用
Promise.all()
。事实上,您可以将所有顺序同步代码组合成一个
。then()
处理程序。如果您向我们显示实际代码(而不是伪代码),Stackoverflow工作得更好我们帮助您修复它,而不是您要求我们编写一些示例,这些示例可能会教您实际需要什么,也可能不会教您实际需要什么。因此,请向我们展示
getData1()
getData2()
getData3()的实际代码
您可能会得到非常有用和具体的帮助。我知道这一点,但有时在发布代码片段之前先澄清概念更容易。Dhruv的回答解释了我不确定的不同概念。此外,我还添加了一个答案来总结解决方案。不,如果包括您,堆栈溢出效果会更好r实际代码-始终如此。没有实际代码,我们只能猜测如何最好地回答对您来说真正重要的问题。而且,有了实际代码,我们有机会向您展示更好的方法来完成您不会想到自己、甚至可能不知道要问的事情。因此,最好是“先澄清概念”。最好在实际代码的确切上下文中澄清概念。我会用代码和概念解释发布答案。课程的Kentoj
getData1()
getData2()
getData3()
asynchronous operations(异步操作)?如果是这样,它们应该返回一个承诺,在异步操作完成时,该承诺将与结果一起解析。还想知道为什么将
promise.all()
data0.map()
data1.map()
一起使用,而不是与
data2.map()一起使用
。如果它们不是异步操作,则无需对它们使用
Promise.all()
。事实上,您可以将所有顺序同步代码组合成一个
。然后()
处理程序。如果您向我们显示实际代码(而不是伪代码),Stackoverflow工作得更好我们帮助您修复它,而不是您要求我们编写一些示例,这些示例可能会教您实际需要什么,也可能不会教您实际需要什么。因此,请向我们展示
getData1()
getData2()
getData3()的实际代码
您可能会得到非常有用和具体的帮助。我知道这一点,但有时更容易获得conc