Javascript 在一系列承诺成功或失败后继续

Javascript 在一系列承诺成功或失败后继续,javascript,jquery,promise,es6-promise,Javascript,Jquery,Promise,Es6 Promise,我希望在所有承诺都已解决或被拒绝时继续,并在最后显示字符串“##########”应为final call。 TL;博士 我忘了在map函数中返回承诺 我尝试使用这种方法: 下面的代码有什么问题 我希望.then的Promise.all()处理程序在所有其他处理程序之后,最终被调用 结果变量包含具有未定义值的数组 console.clear(); $(文档).ready(函数(){ 变量url=”https://httpbin.org/get?"; a=[]; a、 推送(新承诺(功能)

我希望在所有承诺都已解决或被拒绝时继续,并在最后显示字符串“##########”应为final call。
TL;博士

我忘了在map函数中返回承诺


我尝试使用这种方法:

下面的代码有什么问题

我希望
.then
Promise.all()
处理程序在所有其他处理程序之后,最终被调用

结果变量包含具有未定义值的数组

console.clear();
$(文档).ready(函数(){
变量url=”https://httpbin.org/get?";
a=[];
a、 推送(新承诺(功能)(解决、拒绝){
$.get(url+Math.random())。然后((res)=>resolve())。失败(()=>{
拒绝();
});
}));
a、 推送(新承诺(功能)(解决、拒绝){
$.get(url+Math.random())。然后((res)=>resolve())。失败(()=>{
拒绝();
});
}));
var mr=getPromise();
函数getPromise(){
var承诺=新承诺(功能(解决、拒绝){
setTimeout(函数(){
拒绝();
}, 1000);
});
回报承诺;
}
a、 推(mr);
a、 推送(新承诺(功能)(解决、拒绝){
$.get(url+Math.random())。然后((res)=>resolve())。失败(()=>{
拒绝();
});
}));
a、 推送(新承诺(功能)(解决、拒绝){
$.get(url+Math.random())。然后((res)=>resolve())。失败(()=>{
拒绝();
});
}));
承诺。所有(a.map((p)=>{
p、 渔获物((e)=>{
log(“失败的承诺捕获”);
});
}))
。然后((结果)=>{
console.log(“##############”应该是final call;
})
.catch((e)=>{
log(“执行的最终捕获块”);
});
}); // 就绪结束

您忘记将承诺返回地图。您承诺将立即解析未定义的数组

console.clear();
$(文档).ready(函数(){
函数getPromise(){
返回新承诺((解析,拒绝)=>window.setTimeout(拒绝,1000));
}
函数getRandomUrl(){
返回新承诺((resolve,reject)=>$.get(url+Math.random()).done(resolve.fail(reject));
}
变量url=”https://httpbin.org/get?";
a=[];
a、 推送(getRandomUrl());
a、 推送(getRandomUrl());
a、 push(getPromise());
a、 推送(getRandomUrl());
a、 推送(getRandomUrl());
Promise.all(a.map)(p=>{
返回p.catch(console.log);
}))
。然后((结果)=>{
console.log(“##############”应该是final call;
})
.catch((e)=>{
log(“执行的最终捕获块”);
});
});// 就绪结束

您忘记将承诺返回地图。您承诺将立即解析未定义的数组

console.clear();
$(文档).ready(函数(){
函数getPromise(){
返回新承诺((解析,拒绝)=>window.setTimeout(拒绝,1000));
}
函数getRandomUrl(){
返回新承诺((resolve,reject)=>$.get(url+Math.random()).done(resolve.fail(reject));
}
变量url=”https://httpbin.org/get?";
a=[];
a、 推送(getRandomUrl());
a、 推送(getRandomUrl());
a、 push(getPromise());
a、 推送(getRandomUrl());
a、 推送(getRandomUrl());
Promise.all(a.map)(p=>{
返回p.catch(console.log);
}))
。然后((结果)=>{
console.log(“##############”应该是final call;
})
.catch((e)=>{
log(“执行的最终捕获块”);
});
});// 就绪结束
首先,避免!简单使用

function getPromise() {
  return new Promise(function(resolve, reject) {
    window.setTimeout(reject, 1000);
  });
}
const url = "https://httpbin.org/get?";
a = [
  Promise.resolve($.get(url+ Math.random())),
  Promise.resolve($.get(url+ Math.random())),
  getPromise(),
  Promise.resolve($.get(url+ Math.random())),
  Promise.resolve($.get(url+ Math.random()))
];
然后,您的问题是您忘记了从
map
回调中
返回
链接承诺(以及已处理的拒绝),因此您调用了
promise.all
,它位于一个
未定义的
数组上,并立即实现。将其更改为:

Promise.all(a.map(p => {
  return p.catch(e => { console.log("failed promise catch"); });
//^^^^^^
}))
.then(results => {
  console.log("##### should be  final call  ####");
}, e => {
  console.log("final catch block executed");
});
首先,要避免错误!简单使用

function getPromise() {
  return new Promise(function(resolve, reject) {
    window.setTimeout(reject, 1000);
  });
}
const url = "https://httpbin.org/get?";
a = [
  Promise.resolve($.get(url+ Math.random())),
  Promise.resolve($.get(url+ Math.random())),
  getPromise(),
  Promise.resolve($.get(url+ Math.random())),
  Promise.resolve($.get(url+ Math.random()))
];
然后,您的问题是您忘记了从
map
回调中
返回
链接承诺(以及已处理的拒绝),因此您调用了
promise.all
,它位于一个
未定义的
数组上,并立即实现。将其更改为:

Promise.all(a.map(p => {
  return p.catch(e => { console.log("failed promise catch"); });
//^^^^^^
}))
.then(results => {
  console.log("##### should be  final call  ####");
}, e => {
  console.log("final catch block executed");
});

这在NodeJS中可以正常工作。奇怪的是,它在浏览器中失败了!这在NodeJS中可以正常工作。奇怪的是,它在浏览器中失败了!谢谢你,伯吉。但是我还有一个问题关于
Promise.resolve(..)
。如果
$.get
请求的
.then
处理程序依赖于当前执行的函数上下文中的数据,该怎么办。在
Promise.then(…)
中,我只得到请求的结果…和一个高投票率的答案,它使用这个反模式来提示本机xhr请求。实际上,所有答案都使用这种反模式。@图例“当前正在执行的上下文”是什么意思?没有什么是不能用
then
完成的。@不,使用
Promise
构造函数来承诺任何事情不是反模式。它是一种反模式,试图承诺一件已经返回承诺的事情(如
$.ajax
fetch
),或者编写自己的(但更糟)
然后
模式。这也是我在这个评论线程中的第一个问题的答案,关于使用
Promise时的附加上下文参数。解决
谢谢Bergi。但是我还有一个问题关于
Promise.resolve(..)
。如果
$.get
请求的
.then
处理程序依赖于当前执行的函数上下文中的数据,该怎么办。在
Promise.then(…)
中,我只得到请求的结果…和一个高投票率的答案,它使用这个反模式来提示本机xhr请求。实际上,所有答案都使用这种反模式。@图例“当前正在执行的上下文”是什么意思?没有什么是不能用
完成的<