首页 > 解决方案 > 从 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”正在迭代.

感谢您的帮助。

标签: javascriptecmascript-6

解决方案


据我了解,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))

推荐阅读