Async Operations
All API methods support async execution via async(), returning GuzzleHttp\Promise\PromiseInterface instead of blocking until the response arrives. Existing sync behaviour is unchanged.
Builder Async
Call async() on a builder to switch all subsequent operations to async mode:
php
use Rollogi\LaravelHubspot\Crm\Contact;
// Create asynchronously
$promise = Contact::query()->async()->create([
'firstname' => 'Jane',
'email' => 'jane@example.com',
]);
$result = $promise->wait(); // array of created contact data
// Find asynchronously
$promise = Contact::query()->async()->find('123');
$contact = $promise->wait(); // Contact|null
// Delete asynchronously
$promise = Contact::query()->async()->delete();
$promise->wait(); // true
// Batch operations run chunks concurrently in async mode
$promise = Contact::query()->async()->createMany([
['firstname' => 'One'],
['firstname' => 'Two'],
]);
$results = $promise->wait(); // array of created recordsYou can reset the flag with async(false):
php
$builder = Contact::query()->async();
$builder->async(false); // back to sync modeModel Async
Use $model->async() to get an async proxy that fires before-events synchronously and after-events in the promise chain:
php
// Create
$contact = new Contact(['firstname' => 'Jane', 'email' => 'jane@example.com']);
$promise = $contact->async()->save();
$contact = $promise->wait(); // hydrated Contact with exists = true
// Update
$contact->firstname = 'Updated';
$promise = $contact->async()->save();
$contact = $promise->wait();
// Delete
$promise = $contact->async()->delete();
$deleted = $promise->wait(); // true
// Cancelled events return a resolved promise with the unchanged model
Event::listen(Saving::class, fn () => false);
$promise = $contact->async()->save();
$result = $promise->wait(); // unchanged model, no HTTP request sentPool
Execute multiple operations concurrently with HubSpot::pool():
php
use Rollogi\LaravelHubspot\Crm\Contact;
use Rollogi\LaravelHubspot\Crm\Company;
use Rollogi\LaravelHubspot\Facades\HubSpot;
$results = HubSpot::pool()
->add(Contact::class, 'create', [['firstname' => 'Jane', 'email' => 'jane@example.com']])
->add(Contact::class, 'create', [['firstname' => 'John', 'email' => 'john@example.com']])
->add(Company::class, 'create', [['name' => 'Acme Corp']])
->send();
// $results is an array of resolved values or Throwable instances
foreach ($results as $result) {
if ($result instanceof \Throwable) {
// Handle error
}
}Configure default concurrency via config or pass it directly:
php
// config/hubspot.php
'async' => [
'default_concurrency' => 5,
],
// Or pass directly
HubSpot::pool(concurrency: 10)->add(...)->send();Promise Chaining
All async methods return standard GuzzleHttp\Promise\PromiseInterface:
php
$promise = Contact::query()->async()->find('123');
$promise
->then(fn (?Contact $contact) => $contact?->firstname)
->then(fn (?string $name) => logger()->info('Found: ' . $name));
$promise->wait(); // resolve the chain