Bur*_*soy 5 javascript promise ecmascript-2017
我有承诺需要同步的对象.例如,第二个承诺在第一个承诺完成之前不应该起作用.如果第一个拒绝,则必须再次执行.
我已经实现了一些例子.这个很好用.调用getVal,等待2000ms,返回,i ++,再次调用getVal .....
getVal() {
return new Promise(function(resolve, reject) {
setTimeout(function(){ resolve(19) }, 2000);
});
}
async promiseController(){
for(var i =0;i<5;i++)
{
var _val = await this.getVal()
console.log(_val+'prom');
}
}
Run Code Online (Sandbox Code Playgroud)
但我需要控制一组promise对象.我想要做的是我有一个数据,我把它分成5块.在处理完第一部分(例如:发送到服务器)后,我想要处理第二部分,否则我必须再次处理第一部分.
这是我制作的原型实现
getVal() {
return new Promise(function(resolve, reject) {
setTimeout(function(){ resolve(19) }, 2000);
});
}
async promiseController(){
var proms=[]
for(var i =0;i<5;i++)
{
proms.push(this.getVal())
}
for(var i =0;i<5;i++)
{
var _val = await proms[i]
console.log(_val+'prom');
}
}
Run Code Online (Sandbox Code Playgroud)
此代码中的Promises对象按顺序工作.我如何修复下面的代码,以便它作为第一个例子同步工作.
async promiseController(){
for(const value of array) {
console.log((await this.getVal(value))+'prom');
}
}
Run Code Online (Sandbox Code Playgroud)
没必要把事情搞得太复杂。只需await在循环内调用,它就会等待您想要的内容。
正如另一个答案正确地说的那样 - 承诺代表一种价值而不是一种操作。对于操作,使用常规函数。
如果你想忽略失败,你可以.catch(() => {})兑现承诺。如果您想重试直到失败 - 您可以将重试重构为函数并使用它:
const retry = fn => (...args) => fn(...args).catch(retry(fn));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |