co icon indicating copy to clipboard operation
co copied to clipboard

Make primitive types yieldable

Open tzlAsTom opened this issue 9 years ago • 1 comments

const co = require('co');


function delay(seconds){
    if(!(seconds > 0)) return 0;

    return new Promise( (resolve, reject) => {
        setTimeout( () => resolve(seconds), seconds * 1000);
    });
};

return co(function* (){
    let rtn;
    rtn = yield delay(1);
    console.log('rtn1', rtn);
    rtn = yield delay(0);
    console.log('rtn0', rtn);
    return rtn;
}).then( (result) => {
    console.log('result', result);
}).catch( (error) => {
    console.error('error', error);
});

Will get:

[tong@localhost test]$ node genTest.js
rtn1 1
error TypeError: You may only yield a function, promise, generator, array, or object, but the following object was passed: "0"

Expect:

[tong@localhost test]$ node genTest.js
rtn1 1
rtn0 0
result 0

tzlAsTom avatar Sep 05 '16 07:09 tzlAsTom

This should be: if(!(seconds > 0)) return Promise.resolve(0);

Mixing return types in an un-typed language like JS is just asking for maintainability and debugging nightmares. By returning a synchronous Promise, you keep the structure of the code relatively the same and don't introduce any sort of type-handling (was I returned a Promise or a primitive?)

cmazakas avatar Nov 15 '16 22:11 cmazakas