Javascript 节点JS嵌套Promise.all和映射逻辑不工作
我试图得到一个嵌套的承诺。所有*映射逻辑工作。当我到达getData2时,我不断得到未定义的值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
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、 gdata2=>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、 gdata2=>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实际代码-始终如此。没有实际代码,我们只能猜测如何最好地回答对您来说真正重要的问题。而且,有了实际代码,我们有机会向您展示更好的方法来完成您不会想到自己、甚至可能不知道要问的事情。因此,最好是“先澄清概念”。最好在实际代码的确切上下文中澄清概念。我会用代码和概念解释发布答案。课程的KentojgetData1()
,getData2()
和getData3()
asynchronous operations(异步操作)?如果是这样,它们应该返回一个承诺,在异步操作完成时,该承诺将与结果一起解析。还想知道为什么将promise.all()
与data0.map()
和data1.map()
一起使用,而不是与data2.map()一起使用
。如果它们不是异步操作,则无需对它们使用Promise.all()
。事实上,您可以将所有顺序同步代码组合成一个。然后()
处理程序。如果您向我们显示实际代码(而不是伪代码),Stackoverflow工作得更好我们帮助您修复它,而不是您要求我们编写一些示例,这些示例可能会教您实际需要什么,也可能不会教您实际需要什么。因此,请向我们展示getData1()
、getData2()
和getData3()的实际代码
您可能会得到非常有用和具体的帮助。我知道这一点,但有时更容易获得conc