gpt4 book ai didi

javascript - Q.js : How can I rewrite an async series flow in Q. js?

转载 作者:数据小太阳 更新时间:2023-10-29 05:50:11 26 4
gpt4 key购买 nike

为了掌握Q.js,我想在Q.js中使用async.series转换以下代码.基本上我会创建一个文件夹(如果它不存在)(使用 mkdirp),将文件移动到备份文件夹并将文件保存到主文件夹。

var async = require('async');
var fs = require('fs');
var path = require('path');
var sessiondId = new Date().getTime() % 2 == 0 ? new Date().getTime().toString() : '_1234';
var backupFolder = path.join(__dirname,sessiondId);
var backupFullPath = path.join(backupFolder,'a.txt');
var fullPath = path.join(__dirname,'main','a.txt');
var mkdirp = require('mkdirp');

async.series({
createOrSkip: function(callback) {
mkdirp(backupFolder, function (err, dir) {
if(err) {
callback(err, null);
} else {
callback(null, {created: !!dir, folderAt: backupFolder});
}
});
},
move: function(callback) {
fs.rename(fullPath, backupFullPath, function(err) {
if(err) {
callback(err, null);
} else {
callback(null, {backupAt: backupFullPath});
}
});
},
write: function(callback) {
fs.writeFile(fullPath, 'abc', function(err) {
if (err) {
callback(err, null);
} else {
callback(null, {saveAt: fullPath});
}
});
}
}, function(err, result) {
console.log(result);
});

其实我不知道从何说起。感谢您的帮助。

R.

最佳答案

关键是在开始之前使用 Q.denodeify 将 node.js 函数转换为返回 promises,这意味着文件的标题应该如下所示:

var Q = require('q')
var fs = require('fs');
var path = require('path');
var sessiondId = new Date().getTime() % 2 == 0 ? new Date().getTime().toString() : '_1234';
var backupFolder = path.join(__dirname,sessiondId);
var backupFullPath = path.join(backupFolder,'a.txt');
var fullPath = path.join(__dirname,'main','a.txt');

var mkdirp = Q.denodeify(require('mkdirp'));
var rename = Q.denodeify(fs.rename);
var writeFile = Q.denodeify(fs.writeFile);

如果 node.js 本身支持 promises,则不需要该更改。

选项1

// createOrSkip
mkdirp(backupFolder)
.then(function (dir) {
// move
return rename(fullPath, backupFullPath);
})
.then(function () {
// write
return writeFile(fullPath, 'abc');
})
.done(function () {
console.log('operation complete')
});

我认为没有比这更简单的了。就像@Bergi 所说的那样,它更类似于“waterfall ”。如果您想要系列的确切行为(但有 promise ),您将不得不使用选项 2 或选项 3 之类的东西。

选项 2

您可以手动编写代码以保存结果。我通常会发现,虽然这需要一些额外的写作,但它是迄今为止最容易阅读的:

var result = {}
mkdirp(backupFolder)
.then(function (dir) {
result.createOrSkip = {created: !!dir, folderAt: backupFolder};
return rename(fullPath, backupFullPath);
})
.then(function () {
result.move = {backupAt: backupFullPath};
return writeFile(fullPath, 'abc');
})
.then(function () {
result.write = {saveAt: fullPath};
return result;
})
.done(function (result) {
console.log(result);
});

选项3

如果您发现自己一直在使用这种代码,您可以编写一个非常简单的系列助手(我个人从未发现需要这样做):

function promiseSeries(series) {
var ready = Q(null);
var result = {};
Object.keys(series)
.forEach(function (key) {
ready = ready.then(function () {
return series[key]();
}).then(function (res) {
result[key] = res;
});
});
return ready.then(function () {
return result;
});
}
promiseSeries({
createOrSkip: function () {
return mkdirp(backupFolder).then(function (dir) {
return {created: !!dir, folderAt: backupFolder};
});
},
move: function () {
return rename(fullPath, backupFullPath)
.thenResolve({backupAt: backupFullPath});
},
write: function () {
return writeFile(fullPath, 'abc')
.thenResolve({saveAt: fullPath});
}
}).done(function (result) {
console.log(result);
});

我想说的是,一旦您编写了帮助程序,与处理回调所需的所有错误处理相比, promise 的代码要清晰得多。我会说,当您手写它或不跟踪所有这些中间结果时,它会更清楚。

总结

您可能会或可能不会认为这些示例比 async.series 版本更清晰。考虑一下您对该功能的了解程度。它实际上是以一种非常不透明的方式做一些相当复杂的事情。我最初假设只会返回最后一个结果(ala waterfall)并且不得不在 Async 的文档中查找它。我几乎从不需要查找 Promise 库的文档。

关于javascript - Q.js : How can I rewrite an async series flow in Q. js?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18510036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com