循环内依序返回依赖承诺

时间:2018-11-02 21:22:57

标签: javascript arrays

我正在研究shopify集成。 我们收到一个数组项,然后遍历它们,并为它们添加一个新模型(func1),然后我需要使用第一个模型的结果并将其添加到计划表(func2)中。

我需要此功能按顺序运行,因为我正在将结果添加到计划中,并且如果我有两个结果在同一日期,并且它们在数据库中不存在(如果它们并行运行),则会创建2个单独的结果数据库中的条目,而不是具有两个值的一个条目。

我需要返回的方式是func1,func2,func1,func2 ....

但是现在正在返回func1,func1 ... func2,func2 ...

这是我需要完成的工作的简化示例。

 const func2 = () => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          return console.log('func2');
        }, 3000);
      });
    };

const func1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('Func1');
      func2();
    }, 1000);
  });
};

const array = [1, 2, 3, 4, 5];

const test = () => {
  array.map(x => {
    func1();
  });
};
test();

如果有不清楚的地方,请告诉我。 谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用async / await和for循环来创建类似同步的迭代。并在func1中再次使用它以进行重新修饰

const func2 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
       console.log('func2');
       resolve();
    }, 3000);
  });
};

const func1 =  () => {
  return new Promise( (resolve, reject) => {
  setTimeout(async () => {
      console.log('Func1');
      await func2();
      resolve();
    }, 1000);
  });
};

const array = [1, 2, 3, 4, 5];

const test = async () => {
  for(let i=0;i<array.length;i++){
    await func1();

  }
};
test();

答案 1 :(得分:0)

这是使用traverse函数的理想场所:

const traverse = (xs, f) => xs.reduce((promise, x) =>
    promise.then(ys => f(x).then(y => Promise.resolve(ys.concat([y])))),
    Promise.resolve([]));

const times2 = x => new Promise(resolve => setTimeout(() => {
    console.log("times2", x);
    resolve(2 * x);
}, 1000));

const minus1 = x => new Promise(resolve => setTimeout(() => {
    console.log("minus1", x);
    resolve(x - 1);
}, 1000));

const xs = [1,2,3,4,5];

const ys = traverse(xs, x => times2(x).then(minus1));

ys.then(console.log); // [1,3,5,7,9]

希望有帮助。

答案 2 :(得分:0)

const func2 = async (modalValue) => {
  let result = modalValue*5;
  console.log(`Function2 result: ${result}`)
  return result; 
};


async function getModalValue(i){
  // rest of your Code
  return { modal: i*2}
}


const func1 =  async (item) => { 
   let {modal} = await getModalValue(item);
   console.log(`Function1 modal: ${modal}`)
   await func2(modal);
};

const array = [1, 2, 3, 4, 5];

const test = async () => {
  for(let i=0;i<array.length;i++){
    await func1(array[i]);
  }
};

test().then((resp)=> {console.log("Completed")})
 .catch((err)=>{console.log("failure")})