React Native Expo Task Manager

时间:2019-12-29 17:47:39

标签: react-native expo

最终,我希望能够在我的React Native应用程序中运行后台任务(Axios每天至少获取一次以获取一些新数据)。我正在努力使这项工作: https://docs.expo.io/versions/latest/sdk/task-manager/

import * as BackgroundFetch from 'expo-background-fetch';
import * as TaskManager from 'expo-task-manager';

const FETCH_TASKNAME = 'test_task'
const INTERVAL = 60

function test() {
  console.log('function is running')
}

export async function registerFetchTask() {
  TaskManager.defineTask(FETCH_TASKNAME, test());

  const status = await BackgroundFetch.getStatusAsync();
  switch (status) {
      case BackgroundFetch.Status.Restricted:
      case BackgroundFetch.Status.Denied:
          console.log("Background execution is disabled");
          return;

      default: {
          console.debug("Background execution allowed");

          let tasks = await TaskManager.getRegisteredTasksAsync();
          if (tasks.find(f => f.taskName === FETCH_TASKNAME) == null) {
              console.log("Registering task");
              await BackgroundFetch.registerTaskAsync(FETCH_TASKNAME);

              tasks = await TaskManager.getRegisteredTasksAsync();
              console.debug("Registered tasks", tasks);
          } else {
              console.log(`Task ${FETCH_TASKNAME} already registered, skipping`);
          }

          console.log("Setting interval to", INTERVAL);
          await BackgroundFetch.setMinimumIntervalAsync(INTERVAL);
      }
  }

}

并在App.js中调用

import { registerFetchTask } from './helpers/backgroundFetch'

registerFetchTask();

到目前为止,我正在获取控制台日志:

function is running
Background execution allowed
Registering task

但不幸的是,我也遇到以下错误:

TaskManager.defineTask must be called during the initialization phase!

我还在文档中阅读并且按照示例代码,我直接在App.js中运行,而不是在组件类中运行。

我收到以下警告:

[Unhandled promise rejection: Error: Task 'test_task' is not defined. You must define a task using TaskManager.defineTask before registering.]

我不明白,因为它是在注册之前定义的。

不幸的是,在任何地方都找不到合适的工作示例。一个例子可以为与此相关的人们节省大量时间。也许有一种更简单的方法可以使后台任务在React本机应用程序中运行?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我可以发现几个问题:

  1. 定义任务时,请传递对函数的引用,而不要调用它:
TaskManager.defineTask(FETCH_TASKNAME, test); // no parentheses
  1. registerFetchTask()是异步的,这意味着当在App.js中调用时它返回一个Promise。那可能不算作应用程序的“初始化阶段”,因此请尝试删除async

我不知道这些更改是否可以解决问题,但它们应该有所帮助。

答案 1 :(得分:0)

将行TaskManager.defineTask(FETCH_TASKNAME, test());更改为 TaskManager.defineTask(FETCH_TASKNAME, test);

不是传递函数的返回值,而是传递函数引用。