Yield无法解析Promise node.js

时间:2016-04-07 11:02:19

标签: javascript node.js ecmascript-6

我有以下代码,虽然在这个例子中没有任何异步我写它来理解使用生成器和promises的流程。

我的目标是遍历数组并为数组中的每个项执行异步过程,我想按顺序执行。从我所读到的,我期待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;
    }
}

1 个答案:

答案 0 :(得分:1)

我在这里找到了这篇不错的文章和一段很好的代码 http://www.html5rocks.com/en/tutorials/es6/promises/

而不是尝试迭代我的生成器X次并获取值。我正在迭代值并在每次迭代中产生承诺。 on解决它使用我的iterable的下一个方法解析promise,否则它会抛出throw错误。

这是工作代码:

'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);
    }
});