Javascript 与承诺小组合作

Javascript 与承诺小组合作,javascript,node.js,promise,Javascript,Node.js,Promise,我很难理解如何与需要一起解决的承诺团队合作 在我的情况下,我希望基于ID数组进行一系列promise调用,并有选择地将它们添加到输出数组中。如果这是PHP,我会这样做: $output=[] foreach($id形式的输入){ $result1=functioncall1($id); $result2=functioncall2($result1); 如果($result2=='some filter'){ $output[]=$result1; } } 这不能通过异步调用完成,因为循环不会

我很难理解如何与需要一起解决的承诺团队合作

在我的情况下,我希望基于ID数组进行一系列promise调用,并有选择地将它们添加到输出数组中。如果这是PHP,我会这样做:

$output=[]
foreach($id形式的输入){
$result1=functioncall1($id);
$result2=functioncall2($result1);
如果($result2=='some filter'){
$output[]=$result1;
}
}
这不能通过异步调用完成,因为循环不会等待结果返回。所以我对蓝鸟的承诺是这样的:

let filteredResults = Promise.all(arr.map(x => promisifiedFn1(x)))
  .then(xs => xs.map(result1 => promisifiedFn2(result1)))
  .then(ys => ys.filter(someFilteringFn));
Promise.map(输入,函数(id){
承诺功能1(id)
.then(函数(结果1){
//处理结果1更多
承诺功能2(结果1)
.then(函数(结果2){
//处理结果2更多
如果(result2=='some filter'){
返回结果1;
});
});
})
.然后(函数(输出){});
}
这里我显然遗漏了一些东西,因为我的输出只包含一个未定义的数组。然而,它显然是在映射并达到最终结果,而我期望它达到最终结果时,那些未定义的数组只有在过滤确定时才会产生。即使过滤器仅返回文本字符串,也会生成未定义的字符串


我正在清除遗漏的内容,但我正在努力填补空白。

我认为这里已经有了答案,但显然没有(或者如果有,快速搜索几次也没有找到)

您需要这样的结构:

let filteredResults = Promise.all(arr.map(x => promisifiedFn1(x)))
  .then(xs => xs.map(result1 => promisifiedFn2(result1)))
  .then(ys => ys.filter(someFilteringFn));
Promise。所有的
都可以被认为是把一个容器翻过来:你给它一个承诺数组(通过将你的承诺返回函数映射到一个输入数组上),它给你一个结果数组的承诺,然后你就可以像对待任何其他数组一样对待它

因此,
xs
是第一个函数的结果数组,它在所有输入解析后映射到输入上
ys
是第二个。我不确定bluebird的
Promise.map
做了什么,但您可以将我的代码中的前两个步骤与它结合起来


由于在决定是否保留结果之前,您对每个输入都进行了完整的处理,因此只需使用两个异步步骤处理输入,然后在所有问题解决后过滤生成的数组是没有问题的。

请确保您的预期功能正常,这也应该起作用:

var元素=[“一”、“二”、“三”]
var container=document.querySelector(“.results”)
功能promisifiedFunc1(排列){
返回新承诺(功能(解决、拒绝){
setTimeout(函数(){
解析('下一个函数的输入'+arrayElement)
}, 1000)
})
}
函数promisifiedFunc2(从先前的Func输入){
返回新承诺(功能(解决、拒绝){
container.innerHTML+=“
”+inputFromPreviousFunc setTimeout(函数(){ 解析('some filter') }, 1000) }) } Promise.map(元素、功能(一){ 返回promisifiedFunc1(一),然后返回promisifiedFunc2; }) .过滤器(功能(res2){ return res2==='some filter'; }) .then(函数(所有结果){ console.log(所有结果); container.innerHTML+=“
全部完成!”; })

您可以减少eta,使代码看起来更简单:

Promise.map(input, promisifedFunction1)
       .map(promisifiedFunction2)
       .filter(v => v === 'someFilter')
       .then(outputFunction);

您可以使用Promise.all

var promise1 = new Promise(function (resolve, reject) {
    // promise1 code here
    resolve(true);
})
var promise2 = new Promise(function (resolve, reject) {
    // promise2 code here
    resolve(true);
})
var promise3 = new Promise(function (resolve, reject) {
    // promise3 code here
    resolve(true);
})
Promise.all([promise1, promise2, promise3]).then(() => {
    // code
});
这里我们使用了3个承诺,现在如果我们必须在解决所有承诺后执行代码,我们可以使用Promise.all

var promise1 = new Promise(function (resolve, reject) {
    // promise1 code here
    resolve(true);
})
var promise2 = new Promise(function (resolve, reject) {
    // promise2 code here
    resolve(true);
})
var promise3 = new Promise(function (resolve, reject) {
    // promise3 code here
    resolve(true);
})
Promise.all([promise1, promise2, promise3]).then(() => {
    // code
});
承诺。所有
。。。