Sample code for 30+ languages & platforms
Go

Async Methods Returning an Object

See more Async Examples

Demonstrates how to call an asynchronous method that returns an object. This example reads email from a POP3 server using the Async versions of the Chilkat methods.

Chilkat Go Downloads

Go
    success := false

    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    success = false

    mailman := chilkat.NewMailMan()

    // Set the POP3 server's hostname
    mailman.SetMailHost("pop.example.com")

    // Set the POP3 login/password and any other requirements..
    mailman.SetPopUsername("myLogin")
    mailman.SetPopPassword("myPassword")
    mailman.SetPopSsl(true)
    mailman.SetMailPort(995)

    // Connect to the POP3 server:
    c := make(chan *chilkat.Task)
    go mailman.Pop3BeginSessionAsync(    task := <-c
    if mailman.LastMethodSuccess() == false {
        fmt.Println(mailman.LastErrorText())
        mailman.DisposeMailMan()
        task.DisposeTask()
        return
    }

    // Start the background task.

    if !success {
        fmt.Println(task.LastErrorText())
        task.DisposeTask()
        mailman.DisposeMailMan()
        task.DisposeTask()
        return
    }

    // Wait for the POP3 connect task to finish.
    // The true/false returned by Wait applies to the Wait method call, not the task.
    maxWaitMs := 30000
    success = task.Wait(maxWaitMs)
    if !success || (task.StatusInt() != 7) || (task.TaskSuccess() != true) {
        if !success {
            // The task.LastErrorText applies to the Wait method call.
            fmt.Println(task.LastErrorText())
        } else {
            // The ResultErrorText applies to the underlying task method call (i.e. the Pop3BeginSession)
            fmt.Println(task.Status())
            fmt.Println(task.ResultErrorText())
        }

        task.DisposeTask()
        mailman.DisposeMailMan()
        task.DisposeTask()
        return
    }

    task.DisposeTask()

    // Get the number of messages in the mailbox.
    c := make(chan *chilkat.Task)
    go mailman.GetMailboxCountAsync(    task := <-c

    // To keep the example short, we'll skip handling failures.
    // The failures would be handled in the same way as shown above.

    success = task.Wait(maxWaitMs)
    numMessages := task.GetResultInt()
    task.DisposeTask()
    if numMessages == 0 {
        mailman.DisposeMailMan()
        task.DisposeTask()
        task.DisposeTask()
        return
    }

    email := chilkat.NewEmail()

    var i int
    for i = 1; i <= numMessages; i++ {

        c := make(chan *chilkat.Task)
        go mailman.FetchByMsgnumAsync(i,c)
        task := <-c
        if mailman.LastMethodSuccess() == false {
            fmt.Println(mailman.LastErrorText())
            mailman.DisposeMailMan()
            task.DisposeTask()
            task.DisposeTask()
            email.DisposeEmail()
            task.DisposeTask()
            return
        }

        success = task.Wait(maxWaitMs)
        if !success || (task.StatusInt() != 7) || (task.TaskSuccess() != true) {
            if !success {
                // The task.LastErrorText applies to the Wait method call.
                fmt.Println(task.LastErrorText())
            } else {
                // The ResultErrorText applies to the underlying task method call (i.e. the FetchByMsgnum)
                fmt.Println(task.Status())
                fmt.Println(task.ResultErrorText())
            }

            task.DisposeTask()
            mailman.DisposeMailMan()
            task.DisposeTask()
            task.DisposeTask()
            email.DisposeEmail()
            task.DisposeTask()
            return
        }

        // Each Chilkat object that can be a return value of an asynchronous task will
        // have a method named LoadTaskResult.  The object returned in the underlying
        // asynchronous method call is retrieved by calling LoadTaskResult. 

        // To say it another way: The application will provide a pre-existing object of
        // the desired return type (in this case it is an email object).  This object is
        // loaded by calling LoadTaskResult.  

        success = email.LoadTaskResult(task)
        task.DisposeTask()

        if !success {
            fmt.Println(email.LastErrorText())
            mailman.DisposeMailMan()
            task.DisposeTask()
            task.DisposeTask()
            email.DisposeEmail()
            task.DisposeTask()
            return
        } else {
            fmt.Println(email.From(), ": ", email.Subject(), "\n")
        }

    }


    mailman.DisposeMailMan()
    task.DisposeTask()
    task.DisposeTask()
    email.DisposeEmail()
    task.DisposeTask()