{"_id":"@byungi/p-cancel-saga","_rev":"8-f934bbdfad97fa7366508c3a0988c738","name":"@byungi/p-cancel-saga","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.0":{"name":"@byungi/p-cancel-saga","description":"A cancelable promise with saga.","version":"0.2.0","engines":{"node":">= 8"},"keywords":["promise","cancel","cancelable","cancellable","cancellation","abort","generator","saga"],"author":{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"},"repository":{"type":"git","url":"https://github.com/skt-t1-byungi/promise/tree/master/packages/p-cancel-saga"},"main":"index.js","license":"MIT","types":"index.d.ts","dependencies":{"@byungi/p-cancel":"^0.2.0","@byungi/promise-helpers":"^0.2.0"},"devDependencies":{"@byungi/p-delay":"^0.2.0"},"publishConfig":{"access":"public"},"gitHead":"375a7219824bff102d763f8177f49d16a175f505","_id":"@byungi/p-cancel-saga@0.2.0","_nodeVersion":"13.3.0","_npmVersion":"lerna/3.19.0/node@v13.3.0+x64 (win32)","_npmUser":{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"},"dist":{"integrity":"sha512-1h38xZbIwN7DgM7Y8PQRm2WxICDfHkDh1hYodykt9I6cAg/8nhCQogk8U71spwm9I+4XoZpJtJZVGkOnRZXSlw==","shasum":"9eda21209dbe3aff0a454402634fc250f49e6740","tarball":"https://registry.npmjs.org/@byungi/p-cancel-saga/-/p-cancel-saga-0.2.0.tgz","fileCount":4,"unpackedSize":8489,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeB0zICRA9TVsSAnZWagAAuPcQAI5RlB3pnKB0jNZc+/+e\nRsoHRATU5IpZn6Quir3Zpbtyy9fF6YVevDL7Js1H9bsa2Kvi/SFY5XOzgHqP\nZYg0+p+3beWplWYiXOznuBoPDcDAbOqrEuynQDg8rX4hew4uax1NCCKm2IZL\n6fnV2KcJhisWqj5TTf+oYPUkJ+p+NwAJGOzlM7AaIzBb5KO4NIsKejxPrRYt\nXgmV1oHZ4ydgjb+ZCDE4Gdq9YYbIwk+RbZ5EXusFNd7V6fL3DVdablxAFqp8\nfFRCMK4lgPA7H7aKgOlDtk3Ih9S8ZFIGz4E4AMWbbtTwHNn6PwxudH7V2NPl\njJYwz+8r0mTnqFMTBCLRR0JpyetlF6SOzwusKOdk2IXgkUYHcLZZmlKqB8DC\nkX1XNrkTHQ7/V4++4Ph+5bjzfwBAKarKP0o2f/GB1TiA42/nJiwFE3+LnL03\n8laxtxo2sNYBObD0pBmyQ5Vx3zwr77S1FmHPEpjKDktp1XwRHPzi6Docx/bb\nxbAcARIg6KmEHSvav4Yw5BvTouMS7bE03842/eSWiVeJpm4BPZsReQUe37qt\nfwk8lgC7vZbvdEFiQaL8g4Hwthhpki80HUIIZON5X/sNnKb3p99qsOmN6qlm\nDtjIwmzPDXELYBcv/bM+gRzQFYpahpV/c8k3Fd/Lwh4AhibWuLXzqbPwZpF5\nei3e\r\n=whUs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGfICGYgpCVzwi+hDj5hyDpIH9Nh2oZlcH6PIo4milC9AiBb8NOosL51yA642ebQlslHtfNDjEA7m72442Ba00G5aA=="}]},"maintainers":[{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/p-cancel-saga_0.2.0_1577536712269_0.9609036735254184"},"_hasShrinkwrap":false,"deprecated":"Deprecated"},"0.2.1":{"name":"@byungi/p-cancel-saga","description":"A cancelable promise with saga.","version":"0.2.1","engines":{"node":">= 8"},"keywords":["promise","cancel","cancelable","cancellable","cancellation","abort","generator","saga"],"author":{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"},"repository":{"type":"git","url":"https://github.com/skt-t1-byungi/promise/tree/master/packages/p-cancel-saga"},"main":"index.js","license":"MIT","types":"index.d.ts","dependencies":{"@byungi/p-cancel":"^0.2.1","@byungi/promise-helpers":"^0.2.0"},"devDependencies":{"@byungi/p-delay":"^0.2.0"},"publishConfig":{"access":"public"},"gitHead":"5c3eac51561fedd399bc9b2cfd7369dc89d70558","_id":"@byungi/p-cancel-saga@0.2.1","_nodeVersion":"13.3.0","_npmVersion":"lerna/3.20.1/node@v13.3.0+x64 (win32)","_npmUser":{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"},"dist":{"integrity":"sha512-DdzodZr+ezSBWSofEEHG4T9kwsvmTo3YjWrMuUYQgUDQt91GHKDtwQs6e8CRxK/WjQEWyItHHodN37EYM6kv6g==","shasum":"4e2c26c4735d34424cb096431a8cb23151eab898","tarball":"https://registry.npmjs.org/@byungi/p-cancel-saga/-/p-cancel-saga-0.2.1.tgz","fileCount":4,"unpackedSize":8488,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeCb8dCRA9TVsSAnZWagAA6tQP/3oPRAFeYLS0EeQbN3eT\njvzf0aD9FkogoVROr/f4rG6lVXZ1TmOTBVYro6JpJkQd/OHuDtYuHl1ka0bQ\nIsPpIeZ4ftKwqMd3uC8NtjyI5ZwNFDLzRXQN6GI9nYeFsrps3tevbaawnbIS\nZ5Be8NM7YHMBRhUCOASYraIfl8oATmzTuUAiF3kCujDolOJnZKWjS7iZOmfG\nfOnCV8vgOS+AIGm0zZ/HD88f9LWOXQ0UsVlhC3JNy4xCvVLxiYx2Eu5Tu63R\nZmqPWDNWgsx7E2lH/hITkwd0tpdjun72X3fQddTWt0TiDZ+1IPJv141wIjVA\nxT7Af0ifmpoHllv7KWNa51JgQWcnsxdMcyqEPNK9IZ/aEWnsWoMYPlZALU7a\nRwL5TQaI3qdGjpluu82tHli+ZP56Bnl5oq35ggv14Mx7xcI25uTi5br+tobQ\nNtEqicsVOCQJQA+1dmfSr9shKTV43a4XAqfPegT/fk8Yb7UjKiGp0gr0qhin\ny7gZ0SGWYs85Vljua/7o4gw5md3qwhfnYyVvJ/lky4InyDZOMxj9n0ndyWCr\npoJfPS4z5ImAx/pkKi+Htab37ccPc6Al/gzFA5hO/9NXWgHI63/D5ooY6YwS\ny0q+Yay4zLUvfVQKwXRUQtpJ3vNwgFTtlFP0wB9jx2vqRiqCSxdYF1r4rt5d\nzjbv\r\n=xehj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGKLCXqOt72Zb9Hhgy+l5jekUgnT6YQCPmcG0i2BHscPAiEAyNokxpZyG0pZ6C9OFjh90ul9jipTmcyzlFIoKDAJv8c="}]},"maintainers":[{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/p-cancel-saga_0.2.1_1577697052868_0.7487756311450697"},"_hasShrinkwrap":false,"deprecated":"Deprecated"}},"time":{"created":"2019-12-28T12:38:32.098Z","0.2.0":"2019-12-28T12:38:32.417Z","modified":"2022-04-04T21:23:16.487Z","0.2.1":"2019-12-30T09:10:52.988Z"},"maintainers":[{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"}],"description":"A cancelable promise with saga.","keywords":["promise","cancel","cancelable","cancellable","cancellation","abort","generator","saga"],"repository":{"type":"git","url":"https://github.com/skt-t1-byungi/promise/tree/master/packages/p-cancel-saga"},"author":{"name":"skt-t1-byungi","email":"tiniwz@gmail.com"},"license":"MIT","readme":"# @byungi/p-cancel-saga\r\nA cancelable promise with saga.\r\n\r\n## Example\r\n```js\r\nimport pCancelSaga, { IS_CANCELED } from '@byungi/p-cancel-saga'\r\n\r\nconst promise = pCancelSaga(function * () {\r\n    try {\r\n        const result1 = yield async100msTask()\r\n        console.log('The 1st task is done.')\r\n\r\n        const result2 = yield async100msTask()\r\n        console.log('The 2nd task is done.')\r\n\r\n        return result2\r\n    } finally {\r\n        if (yield IS_CANCELED) {\r\n            console.log('Canceled!')\r\n        }\r\n    }\r\n})\r\n\r\ndelay(150).then(() => {\r\n    promise.cancel()\r\n    // => \"The 1st task is done.\"\r\n    // => \"Canceled!\"\r\n    // (`The 2nd task is done.` is not print.)\r\n})\r\n```\r\n\r\n## API\r\n### pCancelSaga(saga)\r\nCreate a cancelable promise using a `saga`(generator).\r\nSimilar to [p-cancel](https://github.com/skt-t1-byungi/promise/tree/master/packages/p-cancel) but without the hassle of checking to cancel after asynchronous task.\r\n\r\n#### Example\r\n###### Before\r\n```js\r\nconst promise = new PCancel((resolve, reject, onCancel) => {\r\n    onCancel(() => console.log('Canceled!'))\r\n\r\n    async100msTask().then(result1 => {\r\n        if (!promise.isCanceled) {\r\n            console.log('The 1st task is done.')\r\n\r\n            async100msTask().then(result2 => {\r\n                if (!promise.isCanceled) {\r\n                    console.log('The 2nd task is done.')\r\n                    resolve(result2)\r\n                }\r\n\r\n            }).catch(reject)\r\n        }\r\n    }).catch(reject)\r\n})\r\n```\r\n\r\n###### After\r\n```js\r\nconst promise = pCancelSaga(function * () {\r\n    try {\r\n        const result1 = yield async100msTask()\r\n        console.log('The 1st task is done.')\r\n\r\n        const result2 = yield async100msTask()\r\n        console.log('The 2nd task is done.')\r\n\r\n        return result2\r\n    } finally {\r\n        if (yield IS_CANCELED) {\r\n            console.log('Canceled!')\r\n        }\r\n    }\r\n})\r\n```\r\n##### Cancel propagation\r\n```js\r\nconst parentPromise = new PCancel((resolve, reject, onCancel) => {\r\n    onCancel(() => {\r\n        console.log('Cancel parent')\r\n    })\r\n    /* ... */\r\n})\r\n\r\nconst childPromise = pCancelSaga(function * () {\r\n    try {\r\n        const result = yield parentPromise\r\n        /* ... */\r\n    } finally {\r\n        if (yield IS_CANCELED) {\r\n            console.log('Cancel child')\r\n        }\r\n    }\r\n})\r\n\r\nchildPromise.cancel()\r\n// => Cancel child\r\n// => Cancel parent\r\n```\r\n\r\n### promise.cancel([reason])\r\nStop the flow in `saga` and throw a `CancelError` to promise.\r\n\r\n### promise.isCanceled\r\nReturns whether the promise is canceled.\r\n\r\n### promise.pipe(onFulfilled, onRejected)\r\nSimilar to `then` but can propagate `cancel` to the upper promise.\r\n\r\n### IS_CANCELED\r\n`yield` this symbol in `saga`, it returns whether  the promise is canceled.\r\n\r\n### factory(saga)\r\nReturns a reusable function using `saga` with arguments.\r\n\r\n```js\r\nimport { factory, IS_CANCELED } from '@byungi/p-cancel-saga'\r\n\r\nconst asyncTaskFunction = factory(function * (url, params) {\r\n    try {\r\n        const result = yield apiGet(url, params)\r\n        return result\r\n    } finally {\r\n        if (yield IS_CANCELED) {\r\n            /* ... */\r\n        }\r\n    }\r\n})\r\n\r\nconst promise = asyncTaskFunction('/data', { id: 1 })\r\n```\r\n\r\n### silent(saga)\r\nIf it's just a cancelable task (not a promise), `CancelError` is bothersome. This function does not propagate an error.\r\n\r\n```js\r\nimport { silent, IS_CANCELED } from '@byungi/p-cancel-saga'\r\n\r\nconst task = silent(function * () {\r\n    while (true) {\r\n        yield delay(1000)\r\n        yield asyncTask()\r\n    }\r\n})\r\n\r\ntask.cancel() // => No `unhandledRejection` occurs.\r\n```\r\n\r\n## Tips\r\n### Type inference of yield promise in saga\r\n```ts\r\nconst promise = pCancelSaga(function * () {\r\n    const data = yield getDataAsync() // => \"data\" type is `any` or `unknown`.\r\n    /* ... */\r\n})\r\n```\r\nIn TypeScript, type inference of yield promise in generator functions is difficult. Specify the type or use the provided helper type(`AsyncResult<F>`).\r\n\r\n```ts\r\nimport pCancelSaga, { AsyncResult } from '@byungi/p-cancel-saga'\r\n\r\nconst promise = pCancelSaga(function * () {\r\n    const data = (yield getDataAsync()) as {value: string}\r\n\r\n    // or\r\n    const data = (yield getDataAsync()) as AsyncResult<typeof getDataAsync>\r\n\r\n    /* ... */\r\n})\r\n```\r\n\r\n## License\r\nMIT\r\n","readmeFilename":"README.md"}