使用 Enum.reduce Elixir 增加几毫秒的日期
Increasing date with few miliseonds using Enum.reduce Elixir
我一直在用Enum.reduce
Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc ->
end)
我将在每个减速器上传递一个方法作为
CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip}, done_at)
在done_at中,默认值为Ecto.DateTime.utc
,但我想在每个Enum.reduce上增加这个日期和时间。
我试图在 Enum.reduce 的开头将日期时间声明为 done_at = Ecto.DateTime.utc
,但我不知道如何在 Enum.reduce
中循环它,以便我可能会增加几秒钟到 it.The 的目的,以便只更改每次迭代的 activity 时间。任何帮助将不胜感激谢谢
Dogbert 更新
Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc ->
with {:found_user, sharee} <- ensure_user(email)
do
case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do
{:ok, camera_share} ->
unless caller == sharee do
send_email_notification(caller, camera, sharee.email, camera_share.message)
end
Camera.invalidate_user(sharee)
Camera.invalidate_camera(camera)
CameraActivity.log_activity(caller, camera, "shared", %{with: sharee.email, ip: requester_ip})
{[camera_share | shares], share_requests, changes}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes]}
end
else
{:not_found, email} ->
case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do
{:ok, camera_share_request} ->
send_email_notification(caller, camera, email, camera_share_request.message, camera_share_request.key)
CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip})
Intercom.intercom_activity(Application.get_env(:evercam_media, :create_intercom_user), get_user_model(email), get_user_agent(conn), requester_ip, "Shared-Non-Registered")
{shares, [camera_share_request | share_requests], changes}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes]}
end
end
end)
您在 Enum.reduce/3
调用中已经有 3 元组作为累加器。您可以将日期时间值添加为元组中的第 4 项,并在每次迭代中递增它。例如,要增加 5 秒,您可以这样做:
Enum.reduce(email_array, {[], [], [], Ecto.DateTime.utc}, fn email, {shares, share_requests, changes, datetime} = _acc ->
# next_datetime is datetime + 5 seconds
next_datetime = datetime |>
Ecto.DateTime.to_erl |>
:calendar.datetime_to_gregorian_seconds |>
Kernel.+(5) |>
:calendar.gregorian_seconds_to_datetime |>
Ecto.DateTime.from_erl
# `next_datetime` should be returned as the 4th value of each tuple below.
# `datetime` can be used as the current value.
with {:found_user, sharee} <- ensure_user(email)
do
case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do
{:ok, camera_share} ->
...
{[camera_share | shares], share_requests, changes, next_datetime}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime}
end
else
{:not_found, email} ->
case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do
{:ok, camera_share_request} ->
...
{shares, [camera_share_request | share_requests], changes, next_datetime}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime}
end
end
end)
我一直在用Enum.reduce
Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc ->
end)
我将在每个减速器上传递一个方法作为
CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip}, done_at)
在done_at中,默认值为Ecto.DateTime.utc
,但我想在每个Enum.reduce上增加这个日期和时间。
我试图在 Enum.reduce 的开头将日期时间声明为 done_at = Ecto.DateTime.utc
,但我不知道如何在 Enum.reduce
中循环它,以便我可能会增加几秒钟到 it.The 的目的,以便只更改每次迭代的 activity 时间。任何帮助将不胜感激谢谢
Dogbert 更新
Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc ->
with {:found_user, sharee} <- ensure_user(email)
do
case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do
{:ok, camera_share} ->
unless caller == sharee do
send_email_notification(caller, camera, sharee.email, camera_share.message)
end
Camera.invalidate_user(sharee)
Camera.invalidate_camera(camera)
CameraActivity.log_activity(caller, camera, "shared", %{with: sharee.email, ip: requester_ip})
{[camera_share | shares], share_requests, changes}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes]}
end
else
{:not_found, email} ->
case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do
{:ok, camera_share_request} ->
send_email_notification(caller, camera, email, camera_share_request.message, camera_share_request.key)
CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip})
Intercom.intercom_activity(Application.get_env(:evercam_media, :create_intercom_user), get_user_model(email), get_user_agent(conn), requester_ip, "Shared-Non-Registered")
{shares, [camera_share_request | share_requests], changes}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes]}
end
end
end)
您在 Enum.reduce/3
调用中已经有 3 元组作为累加器。您可以将日期时间值添加为元组中的第 4 项,并在每次迭代中递增它。例如,要增加 5 秒,您可以这样做:
Enum.reduce(email_array, {[], [], [], Ecto.DateTime.utc}, fn email, {shares, share_requests, changes, datetime} = _acc ->
# next_datetime is datetime + 5 seconds
next_datetime = datetime |>
Ecto.DateTime.to_erl |>
:calendar.datetime_to_gregorian_seconds |>
Kernel.+(5) |>
:calendar.gregorian_seconds_to_datetime |>
Ecto.DateTime.from_erl
# `next_datetime` should be returned as the 4th value of each tuple below.
# `datetime` can be used as the current value.
with {:found_user, sharee} <- ensure_user(email)
do
case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do
{:ok, camera_share} ->
...
{[camera_share | shares], share_requests, changes, next_datetime}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime}
end
else
{:not_found, email} ->
case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do
{:ok, camera_share_request} ->
...
{shares, [camera_share_request | share_requests], changes, next_datetime}
{:error, changeset} ->
{shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime}
end
end
end)