co icon indicating copy to clipboard operation
co copied to clipboard

co handling of return value

Open jakwuh opened this issue 9 years ago • 5 comments

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 avatar Sep 29 '16 21:09 jakwuh

@tj your short answer would be highly relevant.

jakwuh avatar Sep 29 '16 22:09 jakwuh

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;

DeShadow avatar Oct 13 '16 12:10 DeShadow

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

jakwuh avatar Oct 13 '16 13:10 jakwuh

@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 :(

DeShadow avatar Oct 13 '16 13:10 DeShadow

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

jakwuh avatar Oct 14 '16 09:10 jakwuh