Javascript-如何使用循环正确处理承诺?

Javascript-如何使用循环正确处理承诺?,javascript,arrays,promise,Javascript,Arrays,Promise,我正在使用承诺处理任务列表: 这是一个代码示例: var array = ["aaa", "bbbb", "cccc", "dddd", "eeee"]; var result = []; var p = Promise.resolve({ then: function(onFulfill, onReject) { array.forEach(function(x){ // http request with x and make sure this request en

我正在使用
承诺
处理任务列表:

这是一个代码示例:

var array = ["aaa", "bbbb", "cccc", "dddd", "eeee"];
var result = [];
var p = Promise.resolve({ 
  then: function(onFulfill, onReject) { 
   array.forEach(function(x){
     // http request with x and make sure this request ends before a new one if fired
     // put http resolte in array : result.push(httpRespose); 
   });
   //when done, onFulfill(result) 
}
});
p.then(
function(v) {
    console.log(v); // "fulfilled!"
  }, function(e) {
      console.log(e); // not called
});
我希望能够使用数组中的每个元素发出和http请求,然后将结果放入另一个数组中,完成后返回新数组。我还想知道是否可以确保以相同的顺序添加http结果(这不是很重要)


有人能帮忙吗?

承诺。所有的
都是用来等待一些承诺兑现的

每次创建承诺时,将其放入数组中,然后使用

Promise.all(myPromiseArray).then(allDoneHandler)

下面是一个例子:

var项目=[50010001500];
var结果=[];
items.forEach((项目)=>{
让承诺=新承诺((解决)=>{
设置超时(()=>{
控制台日志(项目);
解决(项目);
},项目);
});
结果:推动(承诺);
});
承诺。全部(结果)。然后(()=>{
console.log('done!');
});

承诺。所有的
用于等待一系列承诺兑现

每次创建承诺时,将其放入数组中,然后使用

Promise.all(myPromiseArray).then(allDoneHandler)

下面是一个例子:

var项目=[50010001500];
var结果=[];
items.forEach((项目)=>{
让承诺=新承诺((解决)=>{
设置超时(()=>{
控制台日志(项目);
解决(项目);
},项目);
});
结果:推动(承诺);
});
承诺。全部(结果)。然后(()=>{
console.log('done!');
});
要按顺序“运行承诺”(尤其是从数组中),可以使用以下模式:

var donePromise = arrayOfData.reduce(function(sequence, value, index){
    return sequence.then(function(){
        //doSomethingWithValueAndReturnAPromise
    })
}, Promise.resolve());
但是,由于您希望累积结果,而不仅仅是工作完成时的指标,我们需要修改以下内容:

我们使用
Array.map()

var urls = [/*...*/];

var _sequence = Promise.resolve();
Promise.all(urls.map(function(url) {
    return _sequence = _sequence.then(function(){
        //fetch the url and return a Promise:  
        //return fetch(url).then(response => response.text())
    });
})).then(function(results){
    //console.log(results)
});
要按顺序“运行承诺”(尤其是从数组中),可以使用以下模式:

var donePromise = arrayOfData.reduce(function(sequence, value, index){
    return sequence.then(function(){
        //doSomethingWithValueAndReturnAPromise
    })
}, Promise.resolve());
但是,由于您希望累积结果,而不仅仅是工作完成时的指标,我们需要修改以下内容:

我们使用
Array.map()

var urls = [/*...*/];

var _sequence = Promise.resolve();
Promise.all(urls.map(function(url) {
    return _sequence = _sequence.then(function(){
        //fetch the url and return a Promise:  
        //return fetch(url).then(response => response.text())
    });
})).then(function(results){
    //console.log(results)
});


创建一个承诺数组,并使用
Promise来解析它们。all
:。您可以将所有承诺聚合到一个数组中,并在它们全部完成后用于激发。
//使用x的http请求,并确保此请求在激发新的承诺之前结束
,如果是这种情况,你不要承诺。all@KevinB你能解释一下如何在没有承诺的情况下处理这个问题吗?@dmx嗯,不,因为我不建议对http请求不使用承诺。我只是说,
Promise
all
方法不适合这个目的。更多的是并行操作,而不是按顺序发生的操作,一个接一个。创建一个承诺数组,并使用
Promise来解析它们。all
:。您可以将所有承诺聚合到一个数组中,并在它们全部完成后用于激发。
//使用x的http请求,并确保在激发新的承诺之前结束此请求
,如果是这种情况,你不要承诺。all@KevinB你能解释一下如何在没有承诺的情况下处理这个问题吗?@dmx嗯,不,因为我不建议对http请求不使用承诺。我只是说,
Promise
all
方法不适合这个目的。它更多地用于并行操作,而不是一个接一个地按顺序发生的操作。Nit:
var results=items.map(item=>newpromise(…)@FelixKling谢谢。这在我的示例中是可行的,但为了简单起见,我不想压缩太多。一行代码:Promise.all(items.map(makeAjaxRequest))。然后(console.log)很好,但是免责声明;没有版本的Internet Explorer支持箭头函数-可能需要传输。@StephenP所有支持本机承诺的IE版本(读取:Edge)都支持箭头函数。Nit:
var results=items.map(item=>new Promise(…)@FelixKling谢谢。这在我的示例中是可行的,但为了简单起见,我不想压缩太多。一行代码:Promise.all(items.map(makeAjaxRequest))。然后(console.log)很好,但是免责声明;没有版本的Internet Explorer支持箭头函数-可能需要传输。@StephenP所有支持本机箭头函数的IE版本(读取:Edge)都支持箭头函数。