Haber Araması Yap
MicrosoftTeknoloji

JavaScript’ten AL’ye ve geri: SkipIfBusy

Özlediysen benim JavaScript’ten AL’ye ve geri: SkipIfBusy canlı oturum 8 Ocak’ta, ya da sadece izlemek yerine okumayı tercih ediyorsanız, bu yazı tam size göre. Söz verdiğim gibi, tüm video bloglarımı yazılı olarak takip edeceğim, işte başlıyoruz.

Her şey Erik Hougaard’ın şu tweetiyle başladı:

Kısa cevap – yapmıyorsun. Atlanıp atlanmadığını göremezsiniz ve bu, Kontrol Eklentileri JavaScript çerçevesinin eksikliklerinden yalnızca biridir. Ancak, eğer sararsanız InvokeExtensibilityMethod asenkron işlevlere çağrılar, Bir süre önce teklif ettim, o zaman bunu kesinlikle yapabilirsiniz.

Her zaman olduğu gibi, gerçek açıklamaya geçmeden önce, kodu takip edebileceğiniz depo: https://github.com/vjekob/js2al-back2

Buradaki ana dal, Kontrol Eklentisi atölyelerim sırasında her zaman sunduğum bir demoyu gösteriyor: SkipIfBusy parametresi, bir kontrol eklentisinin davranışını etkiler. Bu demo komik bir şey yapıyor: Her saniye AL’yi çağırıyor ve AL tam olarak iki saniye meşgul olarak yanıt veriyor. Bu, AL’ye yapılan her saniyenin (veya JavaScript ile AL arasındaki gecikmeye bağlı olarak üçüncüsü) başarılı olacağı ve AL meşgul olduğu için tüm diğerlerinin atlanacağı anlamına gelir.

Çıktı bunu güzel bir şekilde gösteriyor:

(Değil TechSmith SnagIt ekranı kaydetmek için harika bir uygulama?)

Davranışı Content.js dosyasının 22. satırı üzerinden kontrol edebilirsiniz. Bunu basitçe değiştirin:

const SKIP_IF_BUSY = true;

… bunun içine:

const SKIP_IF_BUSY = false;

… Ve çıktı da değişir:

Burada, ilk olarak üç kez aramaya çalıştığını görebilirsiniz, ancak farklı katmanlar (tarayıcı, IIS, NST) arasında gecikme olduğu için, AL’nin gerçekten meşgul olduğunu anlamak için Kontrol Eklentisi çerçevesinin üç çağrı yapması gerekir. Ancak meşgul olduğunda bile aramaya devam ediyor. Tüm yanıtların güzel bir şekilde geri geldiğini görmek için 20 saniye kadar bekleyin.

Her neyse, asıl soruya geri dönelim: AL’yi ararsak ve AL gerçekten meşgulse, bir aramanın atlanıp atlanmadığını nasıl anlarız? Bu soruyu cevaplamak için, şuna bir göz atalım. InvokeExtensibilityMethod js2al ve arka dalda önerdiğim sarmalayıcı:

function getALMethod(name) {
    return (...args) => {
        let result;

        window["OnInvokeResult"] = function (alResult) {
            result = alResult;
        }

        return new Promise(resolve => {
            Microsoft.Dynamics.NAV.InvokeExtensibilityMethod(name, args, false, () => {
                delete window.OnInvokeResult;
                resolve(result);
            });
        });
    }
}

Görünüşe göre, yukarıdaki sarmalayıcı umursamıyor SkipIfBusy – meşgulse atlamaz, sadece aramaya devam eder. Bunun üzerine şu şekilde inşa edebilirsiniz:

function getALMethod(name, skipIfBusy) {
    return (...args) => {
        let result;

        window["OnInvokeResult"] = function (alResult) {
            result = alResult;
        }

        return new Promise(resolve => {
            Microsoft.Dynamics.NAV.InvokeExtensibilityMethod(name, args, skipIfBusy, () => {
                delete window.OnInvokeResult;
                resolve(result);
            });
        });
    }
}

Şimdi, sarmalayıcınızın AL meşgulse bir aramayı atlamasını istediğinizde, ikinci argüman olarak true değerini iletirsiniz. getALMethod. Ancak, gerçekten atlanıp atlanmadığını nasıl anlarsınız?

Semboller kurtarmak için.

Yukarıdaki bağlantıya tıklayamayacak kadar tembelseniz, sembol, JavaScript’te oluşturulan her sembol için benzersiz değerleri garanti eden bir veri türüdür. Bunun gibi yeni bir sembol yaratırsınız:

const mySymbol = Symbol();

Ve iki sembolün asla aynı olmadığını kanıtlamak için şuna bir bakın:

Symbol() === Symbol()
// false

Harika, semboller nasıl yardımcı olabilir? Sembolleri bir tür sır olarak kullanabilirsiniz – yalnızca arayan ve arayan uç tarafından bilinen bir şey.

Sarıcıma bir bakalım. Bunu şöyle çağırdığımı hayal edin:

const getValueFromAL = getALMethod("GetValue", false);

(async () => {
    let result = await getValueFromAL();
    // result contains value "returned" by AL
})();

Şimdi, eğer AL dönerse "Hello, World!", sonra result bu değeri içerir. Güzel. Artık sarmalayıcı işlevimizi şu şekilde genişletebiliriz:

function getALMethod(name, SKIP_IF_BUSY) {
    const nav = Microsoft.Dynamics.NAV.GetEnvironment();

    return (...args) => {
        let result;

        window["OnInvokeResult"] = function (alResult) {
            result = alResult;
        }

        return new Promise(resolve => {
            if (SKIP_IF_BUSY && nav.Busy) {
                resolve(SKIP_IF_BUSY);
                return;
            }

            Microsoft.Dynamics.NAV.InvokeExtensibilityMethod(name, args, false, () => {
                delete window.OnInvokeResult;
                resolve(result);
            });
        });
    }
}

AL’yi aramadan önce, önce AL’nin meşgul olup olmadığını kontrol ederiz. AL meşgulse, değerini döndürürüz SKIP_IF_BUSY arayana geri dön. Öyleyse, ilk önce AL çağrımızı şu şekilde bitirirsek:

const getValueFromAL = getALMethod("GetValue", true);

… Ve sonra onu eskisi gibi çağırın, result içerecek true AL aramasının atlandığını belirtmek için. Bunun gibi bir şey:

(async () => {
    let result = await getValueFromAL();
    if (result) {
        // call to AL was skipped
    } else {
        // ... whatever you need to do in other cases
    }
})();

Bununla ilgili sorun çok açık: Ya AL *aslında* İadeler true? Tamam, o zaman bunu şöyle saralım:

const getValueFromAL = getALMethod("GetValue", "SKIPPED!");

… O zaman bu iyi olmalı, değil mi?

(async () => {
    let result = await getValueFromAL();
    if (result === "SKIPPED!") {
        // call to AL was skipped
    } else {
        // ... whatever you need to do in other cases
    }
})();

Evet, bir çeşit … AL gerçekten dönmüşse hariç "SKIPPED!" (sebep ne olursa olsun). Doğru bir şekilde çözmenin tek yolu semboller kullanmaktır. Arayan kodunuz ve sarıcı, AL tarafından bilinmeyen bir sırrı paylaşır, öyle ki AL, siz isteseniz bile bu değeri döndüremeyecektir. Bunun gibi:

const SKIP_TOKEN = Symbol();
const getValueFromAL = getALMethod("GetValue", "SKIPPED!");

(async () => {
    let result = await getValueFromAL();
    if (result === SKIP_TOKEN) {
        // call to AL was really skipped
    } else {
        // ... whatever you need to do in other cases
    }
})();

Ve bu kadar. Kadar basit. Bir SKIP_TOKEN bir sembol olarak, bu sembolü paketleyiciye iletir ve kelimenin tam anlamıyla şunu söylersiniz: eğer AL meşgulse, bu jetonu bana geri verin. AL aynı simgeyle yanıt veremez çünkü bu sembole erişimi yoktur.

Bu güzel küçük numarayı nasıl buldun? Düşüncelerini paylaş!


Bu yazıyı, adresindeki orijinal konumunda okuyun https://vjeko.com/2021/01/26/from-javascript-to-al-and-back-skipifbusy/veya adresinden orijinal blogu ziyaret edin https://vjeko.com. 5e33c5f6cb90c441bd1f23d5b9eeca34

.

Microsoft Communtly News

https://community.dynamics.com/

atmhaber.com

Haber | Spor | Son Dakika haber

Bir cevap yazın

İlgili Makaleler

Reklam
Başa dön tuşu

Reklam Engelleyici Algılandı

Lütfen Reklam Engelleyiciyi Kapatınız...