tj / co

The ultimate generator based flow-control goodness for nodejs (supports thunks, promises, etc)
MIT License
11.88k stars 788 forks source link

co handling of return value #298

Open jakwuh opened 8 years ago

jakwuh commented 8 years ago

I wonder why co yields return value by default. This is an example:

co(function *asyncFn() {
    let browser = yield someAsyncOperation();
    return browser;
}).then(browser => browser.exit());

In the case when browser object has then method, co tries to resolve it, but I (obviously in this case) do not want such a behaviour. I know that co simply passes return value to Promise resolve callback, but implementation can be changed if needed.

Basically, I want to decide on my own if I need the returned value to be resolved as a promise. This could be achieved with such a syntax:

return browser; // simply return what I requested to, no resolving
return yield browser; // resolve browser as a promise and return it

Will be very thankful for any feedback on this issue.

jakwuh commented 8 years ago

@tj your short answer would be highly relevant.

DeShadow commented 8 years ago

return yield browser is not possible to detect. Because JS interpretation will be like: return (yield browser) or the same

let result = yield browser;
return result;
jakwuh commented 8 years ago

@DeShadow you've misunderstood me. I was talking about returning thenable object without trying to resolve it.

DeShadow commented 8 years ago

@jakwuh I understand. I try to say that it's not possible. Because co can't know is construction return val or return yield val.

You can write return { browser }, but co* also check all properties of returned object and wait to Promise.all() of them.

I don't know, how to help you :(

jakwuh commented 8 years ago

@DeShadow I got you. Seems like this is the only possible solution for now. Thank you for the response.