Hi {name},
{message}
Hello ${payload.name},
Welcome to Trigger.dev
`, }); if (error) { // Throwing an error will trigger a retry of this block throw error; } return data; }, { maxAttempts: 3 } ); // Then wait 3 days await wait.for({ days: 3 }); // Send the second email const secondEmailResult = await retry.onThrow( async ({ attempt }) => { const { data, error } = await resend.emails.send({ from: "hello@trigger.dev", to: payload.email, subject: "Some tips for you", html: `Hello ${payload.name},
Here are some tips for you…
`, }); if (error) { // Throwing an error will trigger a retry of this block throw error; } return data; }, { maxAttempts: 3 } ); //etc... }, }); ``` ## Testing your task To test this task in the dashboard, you can use the following payload: ```json { "userId": "123", "email": "{text}
{text}
{weatherLocation ? `The weather in ${weatherLocation} is ${weather} degrees.` : "No weather data"}
Hello ${payload.name},
...
`, }); }, }); ``` This allows you to write linear code without having to worry about the complexity of scheduling or managing cron jobs. In the Trigger.dev Cloud we automatically pause execution of tasks when they are waiting for longer than a few seconds. When triggering and waiting for subtasks, the parent is checkpointed and while waiting does not count towards compute usage. When waiting for a time period (`wait.for` or `wait.until`), if the wait is longer than 5 seconds we checkpoint and it does not count towards compute usage. ## `throwIfInThePast` You can optionally throw an error if the date is already in the past when the function is called: ```ts await wait.until({ date: new Date(date), throwIfInThePast: true }); ``` You can of course use try/catch if you want to do something special in this case. # Writing tasks: Overview Source: https://trigger.dev/docs/writing-tasks-introduction Tasks are the core of Trigger.dev. They are long-running processes that are triggered by events. Before digging deeper into the details of writing tasks, you should read the [fundamentals of tasks](/tasks/overview) to understand what tasks are and how they work. ## Writing tasks | Topic | Description | | :------------------------------------------- | :-------------------------------------------------------------------------------------------------- | | [Logging](/logging) | View and send logs and traces from your tasks. | | [Errors & retrying](/errors-retrying) | How to deal with errors and write reliable tasks. | | [Wait](/wait) | Wait for periods of time or for external events to occur before continuing. | | [Concurrency & Queues](/queue-concurrency) | Configure what you want to happen when there is more than one run at a time. | | [Realtime notifications](/realtime/overview) | Send realtime notifications from your task that you can subscribe to from your backend or frontend. | | [Versioning](/versioning) | How versioning works. | | [Machines](/machines) | Configure the CPU and RAM of the machine your task runs on | | [Idempotency](/idempotency) | Protect against mutations happening twice. | | [Replaying](/replaying) | You can replay a single task or many at once with a new version of your code. | | [Max duration](/runs/max-duration) | Set a maximum duration for your task to run. | | [Tags](/tags) | Tags allow you to easily filter runs in the dashboard and when using the SDK. | | [Metadata](/runs/metadata) | Attach a small amount of data to a run and update it as the run progresses. | | [Usage](/run-usage) | Get compute duration and cost from inside a run, or for a specific block of code. | | [Context](/context) | Access the context of the task run. | | [Bulk actions](/bulk-actions) | Run actions on many task runs at once. | ## Our library of examples, guides and projects