Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使承诺在不使用异步/等待对的情况下彼此等待?_Javascript_Asynchronous_Promise - Fatal编程技术网

Javascript 如何使承诺在不使用异步/等待对的情况下彼此等待?

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: ",

我正在从事不支持ES6标准的旧项目

为了便于理解,我将编写我试图达到的代码,请在不使用异步/等待对的情况下翻译以下代码

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);
}