‫۴ سال و ۶ ماه قبل، شنبه ۳ اسفند ۱۳۹۸، ساعت ۱۲:۰۶
یک نکته‌ی تکمیلی: بافر شدن کل نتیجه‌ی IAsyncEnumerable در ASP.NET Core 3x
در اکشن متدهایی مانند:
[HttpGet]
public IAsyncEnumerable<Product> Get()
    => productsRepository.GetAllProducts();
به علت نبود هیچ نوع JSON serializer ای با پشتیبانی از IAsyncEnumerable (در زمان نگارش این نکته)، کل نتیجه بافر شده و سپس بازگشت داده می‌شود و response stream در کار نیست.
‫۴ سال و ۶ ماه قبل، شنبه ۳ اسفند ۱۳۹۸، ساعت ۱۲:۰۰
یک نکته‌ی تکمیلی: محدود کردن IAsyncEnumerable به یک فضای نام
ممکن است در برنامه‌های NET Core 3x. به خطای مبهم بودن محل دریافت IAsyncEnumerable بر بخورید:
The type ‘IAsyncEnumerable’ exists in both ‘System.Interactive.Async, Version=3.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263’
and ‘System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’
برای رفع آن نیاز است ارجاع IAsyncEnumerable را از System.Interactive.Async در فایل csproj، حذف کنید:
<Target Name="AddAssemblyAliasToReactiveAsync" AfterTargets="ResolveAssemblyReferences">
    <ItemGroup>
        <ReferencePath Condition=" '%(FileName)' == 'System.Interactive.Async' ">
            <Aliases>reactive</Aliases>
        </ReferencePath>
    </ItemGroup>
</Target>
‫۴ سال و ۶ ماه قبل، شنبه ۳ اسفند ۱۳۹۸، ساعت ۱۱:۵۰
یک نکته‌ی تکمیلی: محدودیت بافر IAsyncEnumerable
اگر بیش از 8192 رکورد را به صورت IAsyncEnumerable بازگشت دهیم، خطای زیر ظاهر خواهد شد:
‘AsyncEnumerableReader’ reached the configured maximum size of the buffer when enumerating a value of type ‘<type>’. 
This limit is in place to prevent infinite streams of ‘IAsyncEnumerable<>’ from continuing indefinitely. 
If this is not a programming mistake, consider ways to reduce the collection size, or consider manually converting ‘<type>’ into a list rather than increasing the limit.

برای تنظیم یا تغییر آن می‌توان از خاصیت MvcOptions.MaxIAsyncEnumerableBufferLimit در برنامه‌های ASP.NET Core استفاده کرد.
‫۴ سال و ۶ ماه قبل، جمعه ۲ اسفند ۱۳۹۸، ساعت ۰۵:۵۳
همان new Intl.RelativeTimeFormat مطلب فوق:
function timeDiff(current, prev) {
  const millisecond = current - prev;
  const second = millisecond / 1000;
  const minute = second / 60;
  const hour = minute / 60;
  const day = hour / 24;
  const week = day / 7;
  const month = week / 4.3;
  const year = month / 12;
  const quarter = year / 4;
  const unitValues = {
    millisecond,
    second,
    minute,
    hour,
    day,
    week,
    month,
    year,
    quarter
  };
  return function diffValueByUnit(unitKey) {
    return unitValues[unitKey];
  };
}


const from = new Date();
from.setDate(from.getDate() - 2);
console.log(from);
const to = new Date(Date.now());
console.log(to);
const diff = timeDiff(from, to);
const result = parseFloat(Math.round(diff("hour")));
console.log(result);
const rtf = new Intl.RelativeTimeFormat("fa");
console.log(rtf.format(result, "hour"));
با این خروجی:
> Wed Feb 19 2020 02:24:36 GMT+0330 (Iran Standard Time)
> Fri Feb 21 2020 02:24:36 GMT+0330 (Iran Standard Time)
> -48
> "۴۸ ساعت پیش"
- همانطور که عنوان شد، Stateless Functional Component دیگر وجود خارجی ندارند (به لطف هوک‌ها و دیگر Stateless نیستند) و الان فقط Functional Component هستند.
- پیشتر هم که Stateless بودند، توصیه شده بود که ابتدا با کامپوننت‌های تابعی شروع به کار کنید و اگر نیاز به state وجود داشت، آن‌را به کامپوننت‌های کلاسی ارتقاء دهید (که الان، حالت را هم در کامپوننت‌های تابعی می‌توان داشت).
- کامپوننت‌های تابعی در React 16 اندکی سریعتر هستند (نقل قولی از یکی از عضای تیم React):
Functional components should be slightly faster in React 16 as there's no instance created to wrap them (unlike React 15). 
علت آن عدم نیاز به React.createElement جهت معرفی نهایی آن‌ها است.
‫۴ سال و ۶ ماه قبل، شنبه ۲۶ بهمن ۱۳۹۸، ساعت ۱۴:۴۹
- ASP.NET Core 3.0 فقط این بسته‌ها را مخفی می‌کند؛ نه اینکه استفاده نمی‌کند. اطلاعات بیشتر
‫۴ سال و ۷ ماه قبل، پنجشنبه ۲۴ بهمن ۱۳۹۸، ساعت ۱۲:۴۰
هنوز هم در صورت نیاز می‌توانید از ویژگی‌های قبلی استفاده کنید؛ چیزی حذف نشده.