A
- AccessControlEntry.ConditionToIdentities
- Access.Database
- ActiveDirectory.Domains
- AdobeAnalytics.Cubes
- AdoDotNet.DataSource
- AdoDotNet.Query
- AnalysisServices.Database
- AnalysisServices.Databases
- AzureStorage.BlobContents
- AzureStorage.Blobs
- AzureStorage.DataLake
- AzureStorage.DataLakeContents
- AzureStorage.Tables
B
- BinaryFormat.Binary
- BinaryFormat.Byte
- BinaryFormat.ByteOrder
- BinaryFormat.Choice
- BinaryFormat.Decimal
- BinaryFormat.Double
- BinaryFormat.Group
- BinaryFormat.Length
- BinaryFormat.List
- BinaryFormat.Null
- BinaryFormat.Record
- BinaryFormat.SignedInteger16
- BinaryFormat.SignedInteger32
- BinaryFormat.SignedInteger64
- BinaryFormat.Single
- BinaryFormat.Text
- BinaryFormat.Transform
- BinaryFormat.UnsignedInteger16
- BinaryFormat.UnsignedInteger32
- BinaryFormat.UnsignedInteger64
- BinaryFormat.7BitEncodedSignedInteger
- BinaryFormat.7BitEncodedUnsignedInteger
- Binary data
- Binary.ApproximateLength
- Binary.Buffer
- Binary.Combine
- Binary.Compress
- Binary.Decompress
- Binary.From
- Binary.FromList
- Binary.FromText
- Binary.InferContentType
- Binary.Length
- Binary.Range
- Binary.Split
- Binary.ToList
- Binary.ToText
- Binary.View
- Binary.ViewError
- Binary.ViewFunction
- Byte.From
C
- Cdm.Contents
- Character.FromNumber
- Character.ToNumber
- Combiner.CombineTextByDelimiter
- Combiner.CombineTextByEachDelimiter
- Combiner.CombineTextByLengths
- Combiner.CombineTextByPositions
- Combiner.CombineTextByRanges
- Comparer.FromCulture
- Comparer.Ordinal
- Comparer.OrdinalIgnoreCase
- Controlling byte order
- Csv.Document
- Cube.AddAndExpandDimensionColumn
- Cube.AddMeasureColumn
- Cube.ApplyParameter
- Cube.AttributeMemberId
- Cube.AttributeMemberProperty
- Cube.CollapseAndRemoveColumns
- Cube.Dimensions
- Cube.DisplayFolders
- Cube.MeasureProperties
- Cube.MeasureProperty
- Cube.Measures
- Cube.Parameters
- Cube.Properties
- Cube.PropertyKey
- Cube.ReplaceDimensions
- Cube.Transform
- Currency.From
D
- DateTime.AddZone
- DateTime.Date
- DateTime.FixedLocalNow
- DateTime.From
- DateTime.FromFileTime
- DateTime.FromText
- DateTime.IsInCurrentHour
- DateTime.IsInCurrentMinute
- DateTime.IsInCurrentSecond
- DateTime.IsInNextHour
- DateTime.IsInNextMinute
- DateTime.IsInNextNHours
- DateTime.IsInNextNMinutes
- DateTime.IsInNextNSeconds
- DateTime.IsInNextSecond
- DateTime.IsInPreviousHour
- DateTime.IsInPreviousMinute
- DateTime.IsInPreviousNHours
- DateTime.IsInPreviousNMinutes
- DateTime.IsInPreviousNSeconds
- DateTime.IsInPreviousSecond
- DateTime.LocalNow
- DateTime.Time
- DateTime.ToRecord
- DateTime.ToText
- Date.AddDays
- Date.AddMonths
- Date.AddQuarters
- Date.AddWeeks
- Date.AddYears
- Date.Day
- Date.DayOfWeek
- Date.DayOfWeekName
- Date.DayOfYear
- Date.DaysInMonth
- Date.EndOfDay
- Date.EndOfMonth
- Date.EndOfQuarter
- Date.EndOfWeek
- Date.EndOfYear
- Date.From
- Date.FromText
- Date.IsInCurrentDay
- Date.IsInCurrentMonth
- Date.IsInCurrentQuarter
- Date.IsInCurrentWeek
- Date.IsInCurrentYear
- Date.IsInNextDay
- Date.IsInNextMonth
- Date.IsInNextNDays
- Date.IsInNextNMonths
- Date.IsInNextNQuarters
- Date.IsInNextNWeeks
- Date.IsInNextNYears
- Date.IsInNextQuarter
- Date.IsInNextWeek
- Date.IsInNextYear
- Date.IsInPreviousDay
- Date.IsInPreviousMonth
- Date.IsInPreviousNDays
- Date.IsInPreviousNMonths
- Date.IsInPreviousNQuarters
- Date.IsInPreviousNWeeks
- Date.IsInPreviousNYears
- Date.IsInPreviousQuarter
- Date.IsInPreviousWeek
- Date.IsInPreviousYear
- Date.IsInYearToDate
- Date.IsLeapYear
- Date.Month
- Date.MonthName
- Date.QuarterOfYear
- Date.StartOfDay
- Date.StartOfMonth
- Date.StartOfQuarter
- Date.StartOfWeek
- Date.StartOfYear
- Date.ToRecord
- Date.ToText
- Date.WeekOfMonth
- Date.WeekOfYear
- Date.Year
- DB2.Database
- Decimal.From
- Diagnostics.ActivityId
- Diagnostics.Trace
- DirectQueryCapabilities.From
- Double.From
- Duration.Days
- Duration.From
- Duration.FromText
- Duration.Hours
- Duration.Minutes
- Duration.Seconds
- Duration.ToRecord
- Duration.TotalDays
- Duration.TotalHours
- Duration.TotalMinutes
- Duration.TotalSeconds
- Duration.ToText
E
F
G
H
I
L
- Lines.FromBinary
- Lines.FromText
- Lines.ToBinary
- Lines.ToText
- List.Accumulate
- List.AllTrue
- List.Alternate
- List.AnyTrue
- List.Average
- List.Buffer
- List.Combine
- List.ConformToPageReader
- List.Contains
- List.ContainsAll
- List.ContainsAny
- List.Count
- List.Covariance
- List.Dates
- List.DateTimes
- List.DateTimeZones
- List.Difference
- List.Distinct
- List.Durations
- List.FindText
- List.First
- List.FirstN
- List.Generate
- List.InsertRange
- List.Intersect
- List.IsDistinct
- List.IsEmpty
- List.Last
- List.LastN
- List.MatchesAll
- List.MatchesAny
- List.Max
- List.MaxN
- List.Median
- List.Min
- List.MinN
- List.Mode
- List.Modes
- List.NonNullCount
- List.Numbers
- List.Percentile
- List.PositionOf
- List.PositionOfAny
- List.Positions
- List.Product
- List.Random
- List.Range
- List.RemoveFirstN
- List.RemoveItems
- List.RemoveLastN
- List.RemoveMatchingItems
- List.RemoveNulls
- List.RemoveRange
- List.Repeat
- List.ReplaceMatchingItems
- List.ReplaceRange
- List.ReplaceValue
- List.Reverse
- List.Select
- List.Single
- List.SingleOrDefault
- List.Skip
- List.Sort
- List.Split
- List.StandardDeviation
- List.Sum
- List.Times
- List.Transform
- List.TransformMany
- List.Union
- List.Zip
- Logical.From
- Logical.FromText
Function.InvokeAfter is one of the useful functions available in M that allows you to delay the execution of a function for a certain amount of time. In this article, we will take a closer look at the M code behind Function.InvokeAfter and explore its use cases.
Syntax of Function.InvokeAfter
The syntax of Function.InvokeAfter is as follows:
Function.InvokeAfter(function as function, delay as duration) as any
The function parameter specifies the function that you want to execute after a delay. The delay parameter specifies the duration of the delay before the function is executed. The result of the function is returned as any.
Examples of Function.InvokeAfter
Here are some examples of how Function.InvokeAfter can be used:
Example 1: Delay Execution of a Function
Suppose you have a function that takes a long time to execute, and you want to delay its execution until after all other functions have finished executing. You can use Function.InvokeAfter to delay the execution of the function as follows:
let
delay = #duration(0, 0, 5, 0), // delay execution for 5 seconds
result = Function.InvokeAfter(() => MyFunction(), delay)
in
result
In this example, we define a delay of 5 seconds using the #duration function. We then use Function.InvokeAfter to delay the execution of MyFunction by 5 seconds. The result of MyFunction is stored in the result variable.
Example 2: Retry a Failed Function
Suppose you have a function that sometimes fails due to network or server issues, and you want to retry the function after a certain amount of time. You can use Function.InvokeAfter to retry the function as follows:
let
maxRetries = 5,
delay = #duration(0, 0, 5, 0), // delay execution for 5 seconds
retryFunction = (retryCount) =>
let
result = try MyFunction() otherwise null
in
if retryCount < maxRetries and result = null then
Function.InvokeAfter(() => retryFunction(retryCount + 1), delay)
else
result,
result = retryFunction(0)
in
result
In this example, we define a maximum number of retries as maxRetries and a delay of 5 seconds using the #duration function. We then define a retryFunction that takes a retryCount parameter and retries MyFunction up to maxRetries times. If MyFunction fails, retryFunction calls itself after a delay using Function.InvokeAfter. The result of MyFunction is returned if it succeeds, or null if it fails after maxRetries retries.
Example 3: Throttle API Requests
Suppose you need to make API requests, but the API has a rate limit that prevents you from making too many requests in a short amount of time. You can use Function.InvokeAfter to throttle the requests as follows:
let
maxRequests = 10,
delay = #duration(0, 0, 1, 0), // delay execution for 1 second
requestFunction = (requestCount) =>
let
result = try APIRequest() otherwise null
in
if requestCount < maxRequests and result <> null then
Function.InvokeAfter(() => requestFunction(requestCount + 1), delay)
else
result,
result = requestFunction(0)
in
result
In this example, we define a maximum number of requests as maxRequests and a delay of 1 second using the #duration function. We then define a requestFunction that takes a requestCount parameter and makes APIRequest up to maxRequests times. If APIRequest succeeds, requestFunction calls itself after a delay using Function.InvokeAfter. The result of APIRequest is returned if it succeeds, or null if it fails after maxRequests requests.
Function.InvokeAfter is a useful function in Power Query that allows you to delay the execution of a function for a certain amount of time. It can be used to delay the execution of a long-running function, retry a failed function, or throttle API requests. By understanding the M code behind Function.InvokeAfter and its use cases, you can become a more proficient user of Power Query.