我有需要按顺序运行的动态数量的承诺。
我了解如何按顺序运行承诺,但我无法成功地使其与许多可能变化的承诺保持动态。
这是我发现静态执行此操作的一种方法如何兑现一个又一个的承诺? :
function waitFor(timeout) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(`Finished waiting ${timeout} milliseconds`);
}, timeout);
});
}
waitFor(1000).then(function(result) {
$('#result').append(result+' @ '+(new Date().getSeconds())+'<br>');
return waitFor(2000);
}).then(function(result) {
$('#result').append(result+' @ '+(new Date().getSeconds())+'<br>');
return waitFor(3000);
}).then(function(result) {
$('#result').append(result+' @ '+(new Date().getSeconds())+'<br>');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="result"></div>
我想做同样的事情,但我不想有 3 个嵌套的 Promise,而是想要任何我想要的数字。
你能帮助我吗 ?
多谢!!
使用 Promise 可以通过三种基本方法来完成此任务。
.reduce()
图案。
function waitFor(timeout) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(`Finished waiting ${timeout} milliseconds`);
}, timeout);
});
}
var timeouts = [1000, 2000, 2000, 3000, 1000],
sequence = tos => tos.reduce((p,c) => p.then(rp => waitFor(c))
.then(rc => console.log(`${rc} @ ${new Date().getSeconds()}`)), Promise.resolve());
sequence(timeouts);
- 递归模式。
function waitFor(timeout) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(`Finished waiting ${timeout} milliseconds`);
}, timeout);
});
}
var timeouts = [1000, 2000, 2000, 3000, 1000],
sequence = ([to,...tos]) => to !== void 0 && waitFor(to).then(v => (console.log(`${v} @ ${new Date().getSeconds()}`), sequence(tos)));
sequence(timeouts);
- 从左侧图案开始扫描。
The scanl
模式会将 Promise 一个接一个地排序,但一旦完成,您还可以访问临时 Promise 决议。这在某些情况下可能很有用。如果您要惰性地构造一个异步树结构(仅在需要时从节点分支),您需要访问之前的 Promise 解析。
为了要达到scanl
JS 中的功能,首先我们必须实现它。
var scanl = (xs, f, acc) => xs.map((a => e => a = f(a,e))(acc))
we feed scanl
with xs
这是这个特定示例中的超时数组,f
这是一个回调函数,需要acc
(累加器)和e
(当前项)并返回新的累加器。累加器值(临时承诺决议)被映射到超时数组上,以便在需要时进行访问。
function waitFor(timeout) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(`finished waiting ${timeout} milliseconds`);
}, timeout);
});
}
var timeouts = [1000, 2000, 2000, 3000, 1000],
scanl = (xs, f, acc) => xs.map((a => e => a = f(a,e))(acc)),
proms = scanl(timeouts, // input array
(a,t,r) => a.then(v => (r = v, waitFor(t))) // callback function
.then(v => (console.log(`${r} and ${v}`),
`${r} and ${v}`)),
Promise.resolve(`Started with 0`)); // accumulator initial value
// Accessing the previous sub sequential resolutions
Promise.all(proms)
.then(vs => vs.forEach(v => console.log(v)));
.as-console-wrapper {
max-height: 100% !important
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)