It can make asynchronous tasks that promise cannot complete, ignore the order of sending and receiving, allow binding of asynchronous tasks in pending status, allow triggering a task in multiple functions, and support producer consumer mode and order mode.
English | 简体中文
The async-task-mapping library does not use any third-party dependency packages and does not limit the technology stack.
npm i async-task-mapping --saveversion
import { createTaskList } from "async-task-mapping";
const asyncTask = createTaskList({
  ordered: true,
  taskCount: 2,
  resolveCount: 2,
});
setTimeout(async () => {
  // A Promise.resolve is returned here. You can use either async/await or .then.
  const { list, dataMap } = await asyncTask;
  console.log("data-1", list[0]);
  // or
  asyncTask.then(({ list, dataMap }) => {
    console.log("data-1", list[0]);
  });
}, 100);
setTimeout(async () => {
  const { list, dataMap } = await asyncTask;
  console.log("data-2", dataMap.res2);
}, 200);
setTimeout(() => {
  asyncTask.pushResolve("response1");
}, 300);
setTimeout(() => {
  asyncTask.pushResolve("response2", "res2");
}, 400);You can use these functions in different methods. The result of the above code is:
// time 200: request-2
// time 300: data-1 response1
// time 400: data-2 response2| name | description | default | 
|---|---|---|
| ordered | Is it orderly | false | 
| taskCount | Number of times to access data | 1 | 
| resolveCount | Increase the number of times of data | 1 | 
| name | description | returned data structure | 
|---|---|---|
| then* | The original method of promise | task.then(({list, dataMap})=>{}) | 
| pushResolve | Used to add data | pushResolve(data, name), Not required, data of Promise.resolve | 
| clear | Clear all statuses | -- | 
| paused | pause task | -- | 
| running | continue matching tasks | -- | 
| getStatus | Get current status | { // Whether to complete all request binding requestDone: false, // Whether to complete all pushResolve responseDone: false, //Number of requests bound requestCount: 1 (Number of requests bound), // Number of pushResolve complete responseCount: 1 (Number of pushResolve completed) } | 
The request and response can be out of order.
import { createTaskOrder } from "async-task-mapping";
const taskOrder = createTaskOrder();
setTimeout(async () => {
  // A Promise.resolve is returned here. You can use either async/await or .then.
  const data = await taskOrder;
  console.log("data1", data);
}, 230);
setTimeout(async () => {
  const data = await taskOrder;
  console.log("data2", data);
}, 500);
setTimeout(() => {
  taskOrder.pushResolve("resolve1");
}, 200);
setTimeout(() => {
  taskOrder.pushResolve("resolve2");
}, 300);
setTimeout(() => {
  taskOrder.pushResolve("resolve3");
}, 400);You can use these functions in different methods. The result of the above code is:
// time 230: data1 resolve1
// time 500: data2 resolve2| name | description | returned data structure | 
|---|---|---|
| pushResolve | Used to add data | -- | 
| clear | Clear all statuses | -- | 
| paused | pause task | -- | 
| running | continue matching tasks | -- | 
| getStatus | Get current status | { //Number of incomplete matching requests pendingRequests: 0, //Number of responses that have not completed matching pendingResponses: 0 } | 
| getLastCompletedTask | Get the data matching the last request with the response | -- | 
MIT.