async/await 和递归
async/await and recursion
我正在尝试编写一种方法,该方法以递归方式将 ActionSheetIOS 显示为 select 数组中包含的值和 return selected 值:
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;
}
}
不幸的是,当我调用这个方法时,它 returns undefined
。我猜问题出在 async/await using 但我还没有发现它。
有什么建议吗?
它returns undefined
因为有一条路径没有return
语句。 async-await
模式适用于异步函数,但是 ActionSheetIOS.showActionSheetWithOptions
不是异步的。
异步函数只是 returns 一个 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;
}
}
我正在尝试编写一种方法,该方法以递归方式将 ActionSheetIOS 显示为 select 数组中包含的值和 return selected 值:
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;
}
}
不幸的是,当我调用这个方法时,它 returns undefined
。我猜问题出在 async/await using 但我还没有发现它。
有什么建议吗?
它returns undefined
因为有一条路径没有return
语句。 async-await
模式适用于异步函数,但是 ActionSheetIOS.showActionSheetWithOptions
不是异步的。
异步函数只是 returns 一个 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;
}
}