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 });