要求是在移至下一个调用之前完成当前功能:
var current_data = something;
Run(current_data).then((data1) => {
Run(data1).then(data2 => {
Run(data2).then .....
})
});
仅当我确切知道要获取多少数据时,以上示例才有可能。
答案 0 :(得分:1)
为了使嵌套的Promise成为Promise链的一部分,您需要返回嵌套的Promise。
Run(current_data).then((data1) => {
return Run(data1).then(data2 => {
return Run(data2).then .....
});
});
答案 1 :(得分:1)
我将假设您的数据是分页的,并且您不知道有多少页,因此您可以在while
函数内部使用await
的{{1}}循环像这样:
async
答案 2 :(得分:0)
您可以使用async-await使代码更具可读性。
async function getData(current_data){
let data1 = await Run(current_data)
let data2 = await Run(data1);
let result = await Run(data2);
return result;
}
调用getData函数
getData(data)
.then(response => console.log(response))
.catch(error => console.log(error));
答案 3 :(得分:0)
尝试避免嵌套的承诺。如果您需要调用一系列的promise(取决于上一个调用的响应),则应改为像下面的内容那样进行链接-
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('foo');
}, 1000);
});
promise1.then((response) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(response + ' b');
}, 1000);
});
}).then((responseB) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(responseB + ' c');
}, 1000);
});
}).then((responseC) => {
console.log(responseC); // 'foo b c'
})
如果您的代码可以支持异步等待,那么穆罕默德·阿什法克(Mohammed Ashfaq)提出的建议就是替代方案。
答案 4 :(得分:0)
如果您要一遍又一遍地执行相同的函数,但是要对不同的数据执行,我将创建一个递归函数以返回Promise。
我只是在下面的示例中使用一组数字,您可以将其编辑为当前情况。
var current_data = [1,2,4,5,6]
function Run(data){
if(data.length === 0)
return Promise.resolve(data);
return new Promise((resolve, reject)=>{
//your async operation
//wait one second before resolving
setTimeout(()=>{
data.pop()
console.log(data)
resolve(data)
},1000)
})
.then((results)=>{
return Run(results)
})
}
Run(current_data)