乐趣区

关于前端:Nodejs-工具库-BlueBird-的一些例子mapeach-和-some

map

我是 Array.map() 函数的模仿,但用于异步工作。我能够承受一个并发参数并返回一个 Promise,当所有工作实现后该 Promise 将被 resolved。我的代码更短,特地是当用户须要限度并行任务的数量时十分有用。

看个具体的例子:

const bluebird = require('bluebird');

async function task(data, ms = 1000) {console.log('in async task:', data);
  await bluebird.delay(ms);
  return data;
}

bluebird.map(['A', 'B', 'C', 'D', 'E', 'F'], async (item) => {return task(item);
}, {concurrency: 1}).then((result) => {console.log('final result:', result);
});

每隔一秒钟,打印一行语句:in async task: XX

map 输出参数全副被解决后,打印:final result:['A', 'B', 'C', 'D', 'E', 'F']

如果把 Concurrency 参数改成 2,那么每秒钟同时解决两个元素。

each

BlueBird 采纳一个可迭代的参数并像原生函数 Array.forEach() 一样对其进行循环。它还采纳了一个回调参数,它能够是异步函数,也能够是任何返回 Promise 的函数。这个办法不会一次实现所有工作,而是一个接一个地实现工作。换句话说,每个单位工夫做一件事。因为开发人员不能在原生的 Array.forEach() 函数内进行异步工作,这种场景下能够切换到 BlueBird 的 forEach 实现。

上面的代码和 concurrency = 1 的 map 成果完全一致:

const bluebird = require('bluebird');

async function task(data, ms = 1000) {console.log('in async task for each:', data);
  await bluebird.delay(ms);
  return data;
}

bluebird.each(['A', 'B', 'C', 'D', 'E', 'F'], async (item) => {return task(item);
}).then((result) => {console.log(result);
});

some

some 将一组 promise 作为第一个参数,将 count 参数作为第二个参数。该办法返回一个 Promise,一旦给定 Promise 数组中的 Promise 被 resolved 的个数达到了 count,some 返回的 Promise 就会被 resolve.

例如,如果您给我一个蕴含 10 个承诺和 3 个作为计数参数的列表,我将返回一个承诺,一旦您的列表中的 3 个承诺被履行,该承诺就会被履行。后果,我返回一个数组,其中蕴含已履行承诺的后果。

看个具体的例子:

const bluebird = require('bluebird');

async function task(data, ms = 1000) {console.log(`${data} started`);
  await bluebird.delay(ms);
  console.log(`${data} done`);
  return data;
}

const promises = [2, 0, 1, 9].map(item => task(item ,item * 500));

bluebird.some(promises, 3).then((result) => {console.log('bluebird 3 promised resolved:', result);
});

后果:0 1 2 被 resolve 之后,some 调用返回的 Promise 就 resolve 了:

退出移动版