我有一个promise对象数组,必须按照它们在数组中列出的相同顺序进行解析,即我们不能尝试解析一个元素,直到前一个元素被解析(如方法所示Promise.all([...])).
如果一个元素被拒绝,我需要链接立即拒绝,而不尝试解析以下元素.
我该如何实现这个,或者是否存在这种sequence模式的现有实现?
function sequence(arr) {
return new Promise(function (resolve, reject) {
// try resolving all elements in 'arr',
// but strictly one after another;
});
}
Run Code Online (Sandbox Code Playgroud)
编辑
初始答案表明我们只能sequence得到这些数组元素的结果,而不是它们的执行结果,因为它是在这样的例子中预定义的.
但是,如何以避免早期执行的方式生成一系列承诺呢?
这是一个修改过的例子:
function sequence(nextPromise) {
// while nextPromise() creates and returns another promise,
// continue resolving it;
}
Run Code Online (Sandbox Code Playgroud)
我不想把它变成一个单独的问题,因为我认为它是同一个问题的一部分.
解
下面的一些答案和随后的讨论有点误入歧途,但最终解决方案完全符合我的要求,是在spex库中实现的,作为方法序列.该方法可以迭代一系列动态长度,并根据应用程序的业务逻辑创建promise.
后来我把它变成了一个供大家使用的共享库.
如何更改以下代码,以便触发异步操作并同时运行?
const value1 = await getValue1Async();
const value2 = await getValue2Async();
// use both values
Run Code Online (Sandbox Code Playgroud)
我需要做这样的事情吗?
const p1 = getValue1Async();
const p2 = getValue2Async();
const value1 = await p1;
const value2 = await p2;
// use both values
Run Code Online (Sandbox Code Playgroud) 试图弄清楚如何找到与async.eachSeries完全相同的功能,我需要一个按顺序运行的异步动作列表(不是并行)但是找不到在原生ES6中执行它的方法,任何人都可以建议,请?
ps考虑了发电机/产量,但还没有经验,所以我没有意识到它究竟能帮助我.
编辑1
根据请求,这是一个例子:
假设这段代码:
let model1 = new MongooseModel({prop1: "a", prop2: "b"});
let model2 = new MongooseModel({prop1: "c", prop2: "d"});
let arr = [model1 , model2];
Run Code Online (Sandbox Code Playgroud)
现在,我想在一系列中运行它,而不是并行,所以使用"异步"NPM很容易:
async.eachSeries(arr, (model, next)=>{
model.save.then(next).catch(next);
}, err=>{
if(err) return reject(error);
resolve();
})
Run Code Online (Sandbox Code Playgroud)
我的问题是:使用ES6,我可以原生使用吗?没有NPM'异步'包?
编辑2
使用async/await可以轻松完成:
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();
}
Run Code Online (Sandbox Code Playgroud) 我有一个对象列表.对象将传递给延迟函数.我想在解析前一个调用后才调用具有下一个对象的函数.有什么方法可以做到这一点吗?
angular.forEach(objects, function (object) {
// wait for this to resolve and after that move to next object
doSomething(object);
});
Run Code Online (Sandbox Code Playgroud) javascript ×4
promise ×3
angularjs ×1
async-await ×1
asynchronous ×1
ecmascript-6 ×1
es2017 ×1
es6-promise ×1
foreach ×1