我正在研究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();
如果有不清楚的地方,请告诉我。 谢谢
答案 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")})