javascript - 从 map 方法返回一个函数数组而不执行
问题描述
我的目标是动态生成一个 Promises 数组(通过使用 Array.map()),并在以后执行它们。
export const ExecuteReader = async () => {
let strAll = [1, 2].map((num) => testingFunction (num))
//await Promise.all(strAll)
}
export const testingFunction = (num) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('I have been called');
resolve(1)
}, 1000)
})
}
ExecuteReader 函数由“OnPress”事件调用。(React-Native Touchable 不透明度。)
<TouchableOpacity
onPress={async () => {
await ExecuteReader().catch(err => console.log(err));
}}>
<Text>Click Me</Text>
</TouchableOpacity>
据我了解,strAll Promise 数组不应该执行其底层函数,直到它被等待(“Promise.All”)我的情况,似乎“testingFunction”打印到控制台,而“map”正在迭代.
感谢您的帮助。
解决方案
据我了解,strAll Promise 数组不应该执行其底层函数,直到它被等待(“Promise.All”)我的情况,似乎“testingFunction”打印到控制台,而“map”正在迭代.
这是不正确的。在底层函数解析之前,Promise 本身将无法实现,但会立即开始执行。您可以通过一个简单的示例看到这一点(正如您已经观察到的那样):
const p = new Promise(resolve => {
console.log('Underlying function is running.');
setTimeout(() => resolve('banana'), 500);
});
p.then(console.log);
请注意,您可以多次等待同一个承诺。如果它已经解决,您将立即获得该值:
const p = new Promise(resolve => {
console.log('Underlying function is running.');
setTimeout(() => resolve('banana'), 500);
});
p.then(console.log); // takes ~0.5 second
p.then(console.log); // already resolved; logs instantly
p.then(console.log); // instant
p.then(console.log); // instant
p.then(console.log); // instant
如果你想推迟底层函数的执行,你需要推迟创建承诺。我仍然不完全清楚你为什么需要这样做,但你可以。这是一个人为的示例,它只是将给定函数包装在“任务”对象中,稍后可以通过调用来调用task.run()
:
// just wraps the underlying function in
// an object with a 'run' method
function createTask(fn) {
return {
run: () => new Promise(resolve => resolve(fn()))
};
}
// create some tasks that just return the input value
const tasks = [1,2,3].map(v => createTask(() => v));
// nothing's running yet
console.log('not running yet');
// not running until you invoke run()
setTimeout(() => {
console.log('kicking off now');
Promise.all(tasks.map(t => t.run()))
.then(console.log);
}, 2000);
(原答案)
您只需要返回一个调用您的函数的函数:
let result = arr.map((element) => () => doubleN(element))
推荐阅读
- android - 是否可以使用 exo 播放器播放加密视频?
- c++ - 如何为 C++ Web 开发配置lampp
- jquery - 如何使父 div 跟随 45 度旋转子 div 的高度
- java - 如何获取在 Selenium Java 重放期间遍历的每个页面的请求标头?
- javascript - 在点击功能上运行 jQuery,但不在孩子上运行
- wordpress - 无法在 CodeMirror 编辑器中获取错误计数
- vue.js - 防止在每个输入/惰性输入上触发输入事件?
- android - Listview对android的涟漪效应
- bash - 如何将 bash 命令列表提供给 xargs 以并行运行?
- java - java中的可变变量强制一个线程从主内存中读取最新的副本,但在我的情况下它仍然不是