我希望在promise函数上循环,直到得到我想要的结果。
到目前为止,我使用的递归性如下:
function pull() {
dataFactory.pullFunction().then(function(res) {
pull()
})
}
例如,这会给我的加载栏带来一些前端/风格的bug。
我会这样做:
function pull() {
while (res.status == 'ONGOING') {
dataFactory.pullFunction().then(function(res) {
// my stuffs
})
}
}
但是当我尝试它时,pullFunction()从未被调用过。
发布于 2017-08-28 10:44:35
如果您不能使用async/await
,那么您必须使用一个调用自身的函数。这并不是真正的递归,因为调用堆栈并不像通常的(同步)递归那样堆积起来。
但是,你需要一直坚持承诺。因此,在代码的其余部分中,在初始调用pull
时,也要遵守承诺,并继续使用then
。
可能您还希望将从提取中获得的数据块收集到一个数据集中。
在这里,我将假设响应对象将具有一个包含数据块的数据属性。
这是如何工作的(使用pullFunction
的虚拟实现):
function pull() {
return (function loop(data) {
return dataFactory.pullFunction().then ( res => {
return res.status === 'ONGOING'
? loop(data.concat(res.data))
: data.concat(res.data)
});
})([]);
}
// Mock implementation
var dataFactory = {
pullFunction: function () {
console.log('pull');
return new Promise( resolve => {
setTimeout(_ =>
resolve({
status: Math.random() > 0.7 ? 'DONE' : 'ONGOING',
data: [1,2,3,4]
}),
500)
});
}
}
// test it
pull().then( (data) => {
console.log('data: ', data);
});
.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2017-08-28 09:39:16
只需创建一个isOngoing
变量
let isOngoing = false;
function pull() {
isOngoing = true;
dataFactory.pullFunction()
.then(res => {
if(<your-condition>) {
isOngoing = false;
} else {
pull();
}
})
}
编辑
您在这里处理的是异步操作,不能用传统的while
或for
循环来循环它。除非您的环境允许您使用async/await
功能。
async function pull() {
while (res.status == 'ONGOING')
await dataFactory.pullFunction().then(function(res) {
// my stuffs
})
}
https://stackoverflow.com/questions/45915905
复制