将包含单个数据数组的任务链接(或映射)到任务数组
chaining (or mapping) Task containing a single data array to an array of Tasks
学习 Fanatasy 的一部分 Land/Folk Tale 引导我创建了一些代码。我本质上正在扫描我的网络(通过 someLib)并将结果上传到 mongo 存储库。扫描 returns 返回结果数组,而更新插入 mongo 需要独立处理结果(mongoose - 这也是我第一次使用这个库,所以我可能那里弄错了)。在传统的承诺基础模型中,我会
// step 0: setup
const someLibPomise = makePromiseOf(someLib)
//set 1: get data
const dataArray = yield someLibPomise()
//set 2: convert to array of promises to upsert
const promiseArray = _.map(dataArray, makeUpsertPromise)
//step 3: wait on results
const upsertResults = yield promiseArray
就其本身而言,这是一个非常清晰的表示,但我想推动我对这些功能技术的理解。我的工作版本还有一些不足之处,因为我似乎无法从 someLibTask 函数返回的任务中获取,该函数包含一个对象数组到一个表示各个更新插入的任务数组。我觉得一定有更好的方法,这就是有效的方法:
// step 0: setup
const someLibTask = Async.liftNode(someLib)
const cleanUpData = (dataArray) => {
return _.map(dataArray, (data) => {
// cleanup data object
return data
})
}
const upsertTask = (collection) => {
return (criteria, record) => {
return new Task( (reject, resolve) => {
const callback = (error, data) => {
if (error) reject(error)
else resolve(data)
}
collection.findOneAndUpdate(criteria, record,
{upsert: true}, callback)
})
}
}
const persist = (data) => {
mongoose.connect('mongodb://localhost/db');
const someUpsert = adapt.upsertTask(Some.collection)
const tasks = _.map(data, (record) => {
const criteria = { "id": record.id }
return serverUpsert(criteria, record)
})
return Async.parallel(tasks).fork(console.error, process.exit)
}
// step 1: make a query and return an array of objects
// () => Task(object[])
const dataTask = someLibTask().map(cleanUpData)
// step 2: for the results to error log or persist method
// (d) => (), (d) => ()
dataTask.fork(console.error, persist)
理想情况下,我可以将 dataTask 的结果链接(或映射)到 persist 中,从而将单个任务转换为一组更新插入任务。然后我可以等待。我很想看到类似的内容:
// step 1: make a query and return an array of objects
const dataTask = someLibTask().map(cleanUpData)
// step 2: chain the results into upsert
const upsertTasks = dataTask.chain(persist)
//step 3: wait on the upsert tasks, and then log results
Async.parallel(upsertTasks).fork(console.error, process.exit)
欢迎就如何进一步清理此问题提出建议。也许删除 lodash 映射,支持更惯用的东西,最后的 persisAllTask.fork 也可以写得更好吗?
设置:
const someLibTask = Async.liftNode(someLib)
// cleanUpData :: [{}] => [{}]
const cleanUpData = (dataArray) => {
return _.map(dataArray, (data) => {
// cleanup data object
return data
})
}
// upsertTask :: {} => ( {}, {} => Task {} )
const upsertTask = (collection) => {
return (criteria, record) => {
return new Task( (reject, resolve) => {
const callback = (error, data) => {
if (error) reject(error)
else resolve(data)
}
collection.findOneAndUpdate(criteria, record,
{upsert: true}, callback)
})
}
}
// persist :: [{id :: string, ...}] => [Task {id :: string, ...}]
const persist = (data) => {
mongoose.connect('mongodb://localhost/db');
const someUpsert = upsertTask(Some.collection)
const performUpsert = (serverRecord) => {
const criteria = { "id": record.id }
return serverUpsert(criteria, serverRecord)
}
return _.map(data, performUpsert)
}
// noop :: _ => unit
const noop = () => {}
// [Task] => unit
const waitOnThenExit = (waitingOn) => {
Async.parallel(waitingOn).fork(console.error, logThenExit)
}
过程:
// {} => Task [{id :: string, ...}]
const dataTask = someLibTask({}).map(cleanUpData)
// Task [{id :: string, ...}] => Task [Task {id :: string, ...}]
const persistAllTask = dataTask.map(persist)
persistAllTask.fork(
noop,
waitOnThenExit)
get from a Task which contains an array of objects TO an array of Tasks
那是不可能的。你无法摆脱 Task
monad。要知道您将在该数组中获得多少任务,您需要先 运行 初始任务。
你想要的好像是
someLibTask().map(cleanUpData).chain(persist)
哪个 returns 是所有更新插入结果的另一个任务。
学习 Fanatasy 的一部分 Land/Folk Tale 引导我创建了一些代码。我本质上正在扫描我的网络(通过 someLib)并将结果上传到 mongo 存储库。扫描 returns 返回结果数组,而更新插入 mongo 需要独立处理结果(mongoose - 这也是我第一次使用这个库,所以我可能那里弄错了)。在传统的承诺基础模型中,我会
// step 0: setup
const someLibPomise = makePromiseOf(someLib)
//set 1: get data
const dataArray = yield someLibPomise()
//set 2: convert to array of promises to upsert
const promiseArray = _.map(dataArray, makeUpsertPromise)
//step 3: wait on results
const upsertResults = yield promiseArray
就其本身而言,这是一个非常清晰的表示,但我想推动我对这些功能技术的理解。我的工作版本还有一些不足之处,因为我似乎无法从 someLibTask 函数返回的任务中获取,该函数包含一个对象数组到一个表示各个更新插入的任务数组。我觉得一定有更好的方法,这就是有效的方法:
// step 0: setup
const someLibTask = Async.liftNode(someLib)
const cleanUpData = (dataArray) => {
return _.map(dataArray, (data) => {
// cleanup data object
return data
})
}
const upsertTask = (collection) => {
return (criteria, record) => {
return new Task( (reject, resolve) => {
const callback = (error, data) => {
if (error) reject(error)
else resolve(data)
}
collection.findOneAndUpdate(criteria, record,
{upsert: true}, callback)
})
}
}
const persist = (data) => {
mongoose.connect('mongodb://localhost/db');
const someUpsert = adapt.upsertTask(Some.collection)
const tasks = _.map(data, (record) => {
const criteria = { "id": record.id }
return serverUpsert(criteria, record)
})
return Async.parallel(tasks).fork(console.error, process.exit)
}
// step 1: make a query and return an array of objects
// () => Task(object[])
const dataTask = someLibTask().map(cleanUpData)
// step 2: for the results to error log or persist method
// (d) => (), (d) => ()
dataTask.fork(console.error, persist)
理想情况下,我可以将 dataTask 的结果链接(或映射)到 persist 中,从而将单个任务转换为一组更新插入任务。然后我可以等待。我很想看到类似的内容:
// step 1: make a query and return an array of objects
const dataTask = someLibTask().map(cleanUpData)
// step 2: chain the results into upsert
const upsertTasks = dataTask.chain(persist)
//step 3: wait on the upsert tasks, and then log results
Async.parallel(upsertTasks).fork(console.error, process.exit)
欢迎就如何进一步清理此问题提出建议。也许删除 lodash 映射,支持更惯用的东西,最后的 persisAllTask.fork 也可以写得更好吗?
设置:
const someLibTask = Async.liftNode(someLib)
// cleanUpData :: [{}] => [{}]
const cleanUpData = (dataArray) => {
return _.map(dataArray, (data) => {
// cleanup data object
return data
})
}
// upsertTask :: {} => ( {}, {} => Task {} )
const upsertTask = (collection) => {
return (criteria, record) => {
return new Task( (reject, resolve) => {
const callback = (error, data) => {
if (error) reject(error)
else resolve(data)
}
collection.findOneAndUpdate(criteria, record,
{upsert: true}, callback)
})
}
}
// persist :: [{id :: string, ...}] => [Task {id :: string, ...}]
const persist = (data) => {
mongoose.connect('mongodb://localhost/db');
const someUpsert = upsertTask(Some.collection)
const performUpsert = (serverRecord) => {
const criteria = { "id": record.id }
return serverUpsert(criteria, serverRecord)
}
return _.map(data, performUpsert)
}
// noop :: _ => unit
const noop = () => {}
// [Task] => unit
const waitOnThenExit = (waitingOn) => {
Async.parallel(waitingOn).fork(console.error, logThenExit)
}
过程:
// {} => Task [{id :: string, ...}]
const dataTask = someLibTask({}).map(cleanUpData)
// Task [{id :: string, ...}] => Task [Task {id :: string, ...}]
const persistAllTask = dataTask.map(persist)
persistAllTask.fork(
noop,
waitOnThenExit)
get from a Task which contains an array of objects TO an array of Tasks
那是不可能的。你无法摆脱 Task
monad。要知道您将在该数组中获得多少任务,您需要先 运行 初始任务。
你想要的好像是
someLibTask().map(cleanUpData).chain(persist)
哪个 returns 是所有更新插入结果的另一个任务。