如何调用一系列Promise函数?

时间:2018-09-23 04:42:33

标签: javascript

要求是在移至下一个调用之前完成当前功能:

var current_data = something;
Run(current_data).then((data1) => {
    Run(data1).then(data2 => {
        Run(data2).then .....
    })
});

仅当我确切知道要获取多少数据时,以上示例才有可能。

5 个答案:

答案 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)

相关问题