2015-11-19 6 views
3

Я пытаюсь написать код метода, которые показывают рекурсивны в 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, но я еще не успел это сделать.

Любое предложение?

ответ

7

Он возвращает undefined, потому что есть путь, где нет return. Шаблон async-await хорошо работает с асинхронными функциями, однако ActionSheetIOS.showActionSheetWithOptions не является асинхронным.

Асинхронная функция - это просто функция, которая возвращает Promise. Ключевое слово async - это просто синтаксический сахар, чтобы сделать читаемый код асинхронным, и скрывает за собой обработку обещаний.

К счастью библиотеки, которые используют функции обратного вызова старого стиля может быть легко завернутый в новый стиле Promise функций, возвращающих асинхронными, как это:

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; 
    } 
} 
+0

Это вполне имеет смысл! –