Javascript 如何使承诺在不使用异步/等待对的情况下彼此等待?
我正在从事不支持ES6标准的旧项目 为了便于理解,我将编写我试图达到的代码,请在不使用异步/等待对的情况下翻译以下代码Javascript 如何使承诺在不使用异步/等待对的情况下彼此等待?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我正在从事不支持ES6标准的旧项目 为了便于理解,我将编写我试图达到的代码,请在不使用异步/等待对的情况下翻译以下代码 async function doSomeCalls(arrayWithNeededCalls){ for(let i = 0; i < arrayWithNeededCalls.length; i++){ await makeSomeCall(arrayWithNeededCalls[i]); console.log("Call: ",
async function doSomeCalls(arrayWithNeededCalls){
for(let i = 0; i < arrayWithNeededCalls.length; i++){
await makeSomeCall(arrayWithNeededCalls[i]);
console.log("Call: ", i, " Completed going to next one");
}
}
但它不会等到一个承诺完成后再运行第二个承诺。更新:
评论看起来好多了:
由于OP忽略了承诺返回的值,您可以执行以下操作:
arrayWithneedCalls.reduce((结果,项)=>result.then(()=>makeSomeCall(项)),Promise.resolve()代码>
旧的:
如果您需要逐个运行它们:
makeSomeCall(arrayWithNeededCalls[0])
.then(() => makeSomeCall(arrayWithNeededCalls[1]))
.then(() => makeSomeCall(arrayWithNeededCalls[2]))
.then(() => makeSomeCall(arrayWithNeededCalls[3]))
但是,如果您不知道确切的承诺,而只是使用它们的数组-await
是最佳解决方案您希望依次等待承诺,因此应使用递归:
const doSomeCalls = (arrayWithNeededCalls) => {
const processCall = (index) => makeSomeCall(arrayWithNeededCalls[index]).then(res => {
console.log(`Call ${index} Completed going to next one`);
if (index < arrayWithNeededCalls.length) {
return processCall(index+1);
}
});
return processCall(0);
}
const doSomeCalls=(arrayWithneedCalls)=>{
const processCall=(index)=>makeSomeCall(arrayWithneedCalls[index])。然后(res=>{
log(`Call${index}已完成转到下一个`);
if(索引
您好,您能添加到目前为止尝试过的内容吗?这不是编码服务,请尝试解决您的问题,如果您遇到问题,我们可以帮助您。ArrayWithneedCalls映射到Promises并使用Promise。all
用于并行或将ArrayWithneedCalls减少到一个promiseHello@Nicolas此代码几乎是我试图实现的所有内容,但对于遗留项目,它采用的是较旧的方式。难道没有工具可以将较新的功能转换为较旧的标准吗?Babel还是什么?你应该将ArrayWithneedCalls重设为一个承诺,如果你不想并行处理它们,那么ArrayWithneedCalls中的项目数量可以是动态的。@HMR你能解释一下如何逐个减少吗?(不同时)因为OP忽略了承诺返回的值,所以您可以执行:ArrayWithNeedCalls.reduce((结果,项)=>result.then(()=>makeSomeCall(项)),Promise.resolve()
@HMR是的,看起来不错。您可以在回答中使用它。此解决方案是否会等待第一个承诺完成后再转到另一个?承诺。全部(…promiseArray)
;将同时执行它们,而不是逐个执行这将同时运行所有承诺。@ChrisG完全正确,因此这是错误的解决方案。在这个问题上一个接一个是required@LevanLomia我更新了对递归解决方案的响应,该解决方案一个接一个地运行所有承诺。
const doSomeCalls = (arrayWithNeededCalls) => {
const processCall = (index) => makeSomeCall(arrayWithNeededCalls[index]).then(res => {
console.log(`Call ${index} Completed going to next one`);
if (index < arrayWithNeededCalls.length) {
return processCall(index+1);
}
});
return processCall(0);
}