异步/等待和递归

Posted

技术标签:

【中文标题】异步/等待和递归【英文标题】:async/await and recursion 【发布时间】:2016-02-21 16:06:45 【问题描述】:

我正在尝试编写一种方法,该方法以递归方式显示 ActionSheetios 以选择数组中包含的值并返回所选值:

async function _rescursiveSelect(data, index) 
  if (index < data.length) 
    const object = data[index];

    if (object.array.length === 1) 
      return await _rescursiveSelect(data, index + 1);
    

    ActionSheetIOS.showActionSheetWithOptions(
      title: 'Choose a value from array: ',
      options: object.array,
    ,
    buttonIndex => async function() 
      const selectedValue = data[index].array[buttonIndex];
      data[index].value = selectedValue;
      delete data[index].array;

      return await _rescursiveSelect(data, index + 1);
    );
   else 
    return data;
  

不幸的是,当我调用这个方法时,它返回undefined。我猜这个问题来自 async/await using 但我还没有找到它。

有什么建议吗?

【问题讨论】:

【参考方案1】:

它返回undefined,因为有一条路径没有return 语句。 async-await 模式适用于异步函数,但 ActionSheetIOS.showActionSheetWithOptions 不是异步的。

异步函数只是一个返回Promise 的函数。 async 关键字只是使异步代码可读的语法糖,并隐藏了它背后的 Promise 处理。

幸运的是,使用旧式回调函数的库可以很容易地包装成新式 Promise-returning async 函数,如下所示:

function showActionSheetWithOptionsAsync(options) 
    return new Promise(resolve =>  
        // resolve is a function, it can be supplied as callback parameter 
        ActionSheetIOS.showActionSheetWithOptions(options, resolve);
    );


async function _rescursiveSelect(data, index) 
    if (index < data.length) 
        const object = data[index];

        if (object.array.length === 1) 
            return await _rescursiveSelect(data, index + 1);
        

        const buttonIndex = await showActionSheetWithOptionsAsync(
            title: 'Choose a value from array: ',
            options: object.array
        );
        const selectedValue = data[index].array[buttonIndex];
        data[index].value = selectedValue;
        delete data[index].array;
        return await _rescursiveSelect(data, index + 1);
     else 
        return data;
    

【讨论】:

以上是关于异步/等待和递归的主要内容,如果未能解决你的问题,请参考以下文章

并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁

在异步方法中省略异步和等待[重复]

java中同步和异步有啥异同?

消息队列和异步/等待

异步等待子处理?

C# 中的异步/等待和并行 [关闭]