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