ES6承诺 – 像async.each?

试图找出如何find像async.eachSeriesfunction完全一样的东西,我需要按顺序(不是并行)运行的asynchronous操作列表,但无法find一种方法来执行本地ES6,任何人都可以build议,请?

PS想到发电机/产量,但没有经验,所以我没有意识到它可以帮助我。

编辑1

每个请求,这里是一个例子:

假设这个代码:

let model1 = new MongooseModel({prop1: "a", prop2: "b"}); let model2 = new MongooseModel({prop1: "c", prop2: "d"}); let arr = [model1 , model2]; 

现在,我想以一系列的方式运行它,而不是平行运行,所以使用“asynchronous”NPM很容易:

 async.eachSeries(arr, (model, next)=>{ model.save.then(next).catch(next); }, err=>{ if(err) return reject(error); resolve(); }) 

我的问题是:用ES6,我可以做到吗? 没有NPM的“asynchronous”包?

编辑2

与asynchronous/等待它可以很容易地完成:

 let model1 = new MongooseModel({prop1: "a", prop2: "b"}); let model2 = new MongooseModel({prop1: "c", prop2: "d"}); let arr = [model1 , model2]; for(let model of arr){ await model.save(); } 

对于那些喜欢简短答案的人:

 [func1, func2].reduce((p, f) => p.then(f), Promise.resolve()); 

比方说,你想调用一些数据的asynchronous函数,你希望它们顺序调用,而不是并行调用。

async.eachSeries()的接口如下所示:

 eachSeries(arr, iterator, [callback]) 

以下是如何使用承诺来模拟:

 // define helper function that works kind of like async.eachSeries function eachSeries(arr, iteratorFn) { return arr.reduce(function(p, item) { return p.then(function() { return iteratorFn(item); }); }, Promise.resolve()); } 

这假定iteratorFn把这个项目作为一个参数来处理,并且它返回一个promise。

这里有一个用法示例(假设你有一个promisified fs.readFileAsync() )并且有一个叫做speak()的函数,它在完成时返回一个promise。

  var files = ["hello.dat", "goodbye.dat", "genericgreeting.dat"]; eachSeries(files, function(file) { return fs.readFileAsync(file).then(function(data) { return speak(data); }); }); 

这可以让承诺基础架构为您排列一切。


你也可以手动sorting(尽pipe我不知道为什么):

 function eachSeries(arr, iteratorFn) { return new Promise(resolve, reject) { var index = 0; function next() { if (index < arr.length) { try { iteratorFn(arr[index++]).then(next, reject); } catch(e) { reject(e); } } else { resolve(); } } // kick off first iteration next(); }); } 

或者,一个简单的版本,手动链接在一起的承诺:

 function eachSeries(arr, iteratorFn) { var index = 0; function next() { if (index < arr.length) { return iteratorFn(arr[index++]).then(next); } } return Promise.resolve().then(next); } 

注意一个手动版本必须用try/catch包围iteratorFn()以确保它是安全的(将exception转换为拒绝)。 .then()会自动抛出,所以其他scheme不必手动捕获exception,因为.then()已经为你捕获它们。

您可以通过在callback中返回链接。 例如:

 new Promise(function(resolve, reject){ resolve(1) }).then(function(v){ console.log(v); return v + 1; }).then(function(v){ console.log(v) }); 

将打印:

1
2

这当然是asynchronous解决诺言的工作:

 new Promise(function(resolve, reject){ setTimeout(function(){ resolve(1); }, 1000) }).then(function(result){ return new Promise(function(resolve, reject){ setTimeout(function(){ console.log(result); resolve(result + 1); }, 1000) }); }).then(function(results){ console.log(results); }); 

印刷:

1
2

//上传这个运行较低nodejs版本的系统(Azure:/)不是最短的,但最好的我可以想到

例如让“functionWithPromise”返回一些承诺,并期望一些项目。

 functionWithPromise(item); promisesArray =[]; //syncornized itemsArray.forEach(function (item){ promisesArray.push(functionWithPromise(item)); }); Promise.all(promisesArray).then(function (values){ //profit });