[Javascript] فهم تدفق التعليمات البرمجية مع العائد / المولدات


Answers

لقد نشرت تفسيرا مفصلا لكيفية عمل المولدات الكهربائية هنا .

في شكل مبسط، قد تبدو التعليمات البرمجية الخاصة بك مثل هذا دون co (لم تختبر):

function workAsync(fileName)
{
    // async logic
    var worker = (function* () {

        function read(path) {
            return function (done) {
                fs.readFile(path, "file", done);
            }
        }

        console.log(yield read(fileName));
    })();

    // driver
    function nextStep(err, result) {
        try {
            var item = err? 
                worker.throw(err):
                worker.next(result);
            if (item.done)
                return;
            item.value(nextStep);
        }
        catch(ex) {
            console.log(ex.message);
            return;
        }
    }

    // first step
    nextStep();
}

workAsync("file");

جزء السائق من workAsync يتكرر بشكل غير متزامن من خلال كائن المولد، عن طريق استدعاء nextStep() .

Question

لقد قرأت على عدة أمثلة من التعليمات البرمجية باستخدام مولدات جافا سكريبت مثل هذا واحد . أبسط مولد باستخدام كتلة يمكنني أن أخرج مع شيء من هذا القبيل:

function read(path) {
    return function (done) {
        fs.readFile(path, "file", done);
    }
}

co(function *() {
    console.log( yield read("file") );
})();

هذا لا فعلا طباعة محتويات file ، ولكن بلدي شنق هو حيث done . على ما يبدو، العائد هو السكر النحوي لالتفاف ما يعود إلى في رد الاتصال وتعيين قيمة النتيجة بشكل مناسب (وعلى الأقل في حالة co ، رمي حجة الخطأ إلى رد). هل أفهم أن بناء الجملة صحيح؟

ما done یبدو yield عندما یستخدم yield ؟




Links