await a list of promises in WebCore

It is possible to "await" for an array (or list) of promises in WebCore.... e.g. something like:

Procedure DoSomeTasks(Data : Array);
var
i : integer;
TaskResults : TJSValueDynArray;
Tasks : TJSPromiseArray;
begin
SetLength(Tasks,High(Data));

For i := 0 to High(Data) do Tasks[i] := SomeAsyncFunc(Data[i]);

TaskResults := await(TJSValueDynArray,(TJSPromise.all([Tasks]));
end;

An example of multiple await is here:

(from: pas2js AsyncAWait - Free Pascal wiki)


// Translated from https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await
program tryfetchmany;

{$mode objfpc}

uses
  browserconsole, JS, Web, SysUtils, Types;

function FetchBlob(url: string): TJSBlob; async;
var
  response: TJSResponse;
begin
  response := await(window.fetch(url));
  if not response.ok then
    raise Exception.create('HTTP error! status: '+str(response.status))
  else
    Result:=await(response.blob());
end;

function FetchText(url: string): string; async;
var
  response: TJSResponse;
begin
  response := await(window.fetch(url));
  if not response.ok then
    raise Exception.create('HTTP error! status: '+str(response.status))
  else
    Result:=await(response.text());
end;

procedure DisplayContent; async;
var
  coffee, tea, description: TJSPromise;
  objectURL1, objectURL2, descText: String;
  values: TJSValueDynArray;
  image1, image2: TJSHTMLImageElement;
  para: TJSHTMLElement;
begin
  try
    coffee := FetchBlob('test1.png');
    tea := FetchBlob('test1.png');
    description := FetchText('description.txt');

    values := await(TJSValueDynArray,TJSPromise.all([coffee, tea, description]));

    objectURL1 := TJSURL.createObjectURL(values[0]);
    objectURL2 := TJSURL.createObjectURL(values[1]);
    descText := string(values[2]);

    image1 := TJSHTMLImageElement(document.createElement('img'));
    image2 := TJSHTMLImageElement(document.createElement('img'));
    image1.src := objectURL1;
    image2.src := objectURL2;
    document.body.appendChild(image1);
    document.body.appendChild(image2);

    para := TJSHTMLElement(document.createElement('p'));
    para.textContent := descText;
    document.body.appendChild(para);

  except
    writeln(JSExceptValue);
  end;
end;

begin
  DisplayContent;
end.

Thanks Bruno

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.