Nano Hash - криптовалюты, майнинг, программирование

Yield не разрешает Promise node.js

У меня есть следующий код, и хотя в этом примере нет ничего асинхронного, я написал его, чтобы понять поток с использованием генераторов и промисов.

Моя цель - пройтись по массиву и выполнить асинхронный процесс для каждого отдельного элемента в массиве, и я хочу сделать это по порядку. Из того, что я прочитал, я ожидал, что yield operator(rule); даст значение разрешенного обещания. Вместо значения false он дает мне обещание, подобное следующему Promise { false }

Я думаю, что я упускаю/не понимаю что-то важное в этом потоке.

Вот код:

'use strict';

let operator = function (rule) {
    return new Promise((resolve, reject) => {
        resolve(rule.bool);
    });
};

let setOfRule = [
    {
        name: 'one',
        bool: false
    },
    {
        name: 'two',
        bool: false
    },
    {
        name: 'three',
        bool: false
    }
];

let myGen = function* (rules) {
    for (let rule of rules) {
        try {
            yield operator(rule);
        } catch (e) {
            console.log(e);
        }
    }
};

for (let filtered of myGen(setOfRule)) {
    console.log(filtered); // Promise { false }
    console.log(`Is it filtered: ${filtered}`); // Is it filtered: [object Object]

    if (filtered) {
        break;
    }
}

  • yield и генераторы синхронны. Обещания асинхронны. Вы не можете заставить асинхронный промис выполняться синхронно, просто вернув его из функции-генератора. Для этого вам следует заглянуть в библиотеку типа co. 07.04.2016
  • Спасибо. По-видимому, у меня сложилось впечатление, что yield будет ждать, пока обещание не будет разрешено. Я продолжу читать на эту тему. @ waza007 Я знаю асинхронность и много раз ее использовал, но я хотел понять вышеизложенное. 07.04.2016

Ответы:


1

Я нашел эту замечательную статью и хороший фрагмент кода здесь http://www.html5rocks.com/en/tutorials/es6/promises/

Вместо того, чтобы пытаться перебрать мой генератор X раз и получить значение. Я перебираю значения и даю обещание на каждой итерации. При разрешении он разрешает обещание с помощью следующего метода моей итерации, в противном случае он отклоняется с ошибкой броска.

Вот рабочий код:

'use strict';

let operator = function (rule) {
    return new Promise((resolve, reject) => {
        resolve(rule.bool);
    });
};

let setOfRule = [
    {
        name: 'one',
        bool: false
    },
    {
        name: 'two',
        bool: false
    },
    {
        name: 'three',
        bool: false
    }
];

let spawn = function spawn(generatorFunc) {
    function continuer(verb, arg) {
        let result;
        try {
            result = generator[verb](arg);
        } catch (err) {
            return Promise.reject(err);
        }

        if (result.done) {
            return result.value;
        } else {
            return Promise.resolve(result.value).then(onFulfilled, onRejected);
        }
    }

    let generator = generatorFunc();
    let onFulfilled = continuer.bind(continuer, 'next');
    let onRejected = continuer.bind(continuer, 'throw');

    return onFulfilled();
}

spawn(function *() {
    try {
        for (let rule of setOfRule) {
            let something = yield operator(rule);

            console.log(something);
        }

        console.log('Done!!!!');
    } catch (err) {
        console.log('Error: ', err);
    }
});
07.04.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..