在node.js中依次运行多个asynchronous函数
我是新来javascript还node.js环境。 回电很难。 因为当我有很多程序连接在一起,很难写,它会变得非常讨厌。
所以,我谷歌的答案后,我find了asynchronous工具,但它仍然运行,它可以执行代码块通过使用callback。 例如,f1 – > f2 – > f3 …
然而,我们总是有一个延迟的服务器和我的电脑。 那么如果我做了一些像创build桶一样的东西,然后打印我有多less。 它会打印出原来的桶数不是我添加一个之后。 像删除桶相同的情况….可以上帝帮助我
谢谢…
function bucketSerialTesting(s3) { async.series([ function f1(callback) { settingBucket ('testjsbucket2',s3); callback('1'); } , function f2(callback) { settingBucket('testjsbucket3', s3); callback('2'); } , function f3(callback) { listBucket(s3); callback('3'); } , function f4(callback) { deleteBucket('testjsbucket2', s3); callback('4'); } , function f5(callback) { deleteBucket('testjsbucket3', s3); callback('5'); } , function f6(callback) { listBucket(s3); callback('6'); }, ], function(err, results){ console.log(results); }); } function settingBucket (bucketName, s3){ var s3 = new AWS.S3(); var params = { Bucket: bucketName, /* required */ }; s3.createBucket(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }).on('success',function(response) //put bucket cors for browsers javascript testing { var params = { Bucket: bucketName, /* required */ CORSConfiguration: { CORSRules: [ { AllowedHeaders: ['*',], AllowedMethods: ['GET','PUT','DELETE','POST'], AllowedOrigins: ['*','null'], ExposeHeaders: ['ETag',], }, ] }, }; s3.putBucketCors(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); console.log('put bucketcors succeed'); } }); }).send(); } function listBucket(s3) { s3.listBuckets(function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); console.log('we have '+data.Buckets.length.toString()+' buckets'); for (var i = data.Buckets.length - 1; i >= 0; i--) { console.log(data.Buckets[i].Name); }; } // successful response }); } function deleteBucket(bucketName, s3){ var params = { Bucket: bucketName, /* required */ }; s3.listObjectVersions(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else{ console.log(data); params = {Bucket: bucketName}; params.Delete = {}; params.Delete.Objects = []; console.log(data.Versions.length); for(j = 0; j < data.Versions.length;++j) { params.Delete.Objects.push({Key: data.Versions[j].Key, VersionId: data.Versions[j].VersionId }); } for(j = 0; j < data.DeleteMarkers.length;++j) { params.Delete.Objects.push({Key: data.DeleteMarkers[j].Key, VersionId: data.DeleteMarkers[j].VersionId }); } s3.deleteObjects(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); } params = {Bucket: bucketName}; s3.deleteBucket(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); }); } }); }
其中一个选项是Q承诺,这真的有助于解开callback地狱,并将你的代码扁平化一点。
https://github.com/kriskowal/q
推迟,解决/拒绝模式将适合你。
这是一个平滑asynchronous工作的例子。 它打印一个文件hello.txt(存在),在不存在的文件上等待第二个错误,跳转到失败处理程序,然后运行finally。
var Q = require('q'); var fs = require('fs'); var path = require('path'); // a promise just defers execution of success or failure - must return the promise. notice how it calls resolve in the callback of the async function. var wait = function(ms) { var defer = Q.defer(); console.log('waiting ' + ms + ' ms'); setTimeout(function() { defer.resolve(); }, ms); return defer.promise; } // you can wrap a node callback function with Q.defer and call reject or resolve var getFileContents = function(path) { var defer = Q.defer(); fs.readFile(path, function(err, data) { if (err) { defer.reject(err); } else { // can't pass multiple args back - it returns one obj defer.resolve({ path: path, data: data }); } }); return defer.promise; } var ms = 1000; var printFile = function(filePath) { // even function wrapping up work returns a promise so it can be // connected with another outer sequence of work return wait(ms) .then(function() { console.log(new Date().toString()); }) .then(function() { // if you call async that returns promise, you must return it return getFileContents(filePath); }) // the resolve data from previous promise is passed as input to next then .then(function(contents) { console.log(contents.path + ':'); console.log(contents.data.toString()); }) } // sometimes you need to just return a no op based on a conditional check etc... var noOpPromise = function() { console.log('no op'); return Q(null); } printFile(path.join(__dirname, 'hello.txt')) .then(function() { // throw new Error('throwing will jump to fail'); return wait(1000); }) .then(function() { return printFile(path.join(__dirname, 'noexist.txt')); }) .then(function() { console.log('should never get here'); }) // can also use .catch .fail(function(err) { console.error('Error: ' + err.message); }) .fin(function() { console.log('done with work'); })
function bucketSerialTesting(s3) { Q.fcall(function f1() { return settingBucket ('testjsbucket20',s3); }) .then(function f2() { return settingBucket('testjsbucket30', s3); } ) .then(function f3() { return listBucket(s3); } ) .then(function f4() { return deleteBucket('testjsbucket20', s3); } ) .then(function f4() { return deleteBucket('testjsbucket30', s3); } ) .then(function f4() { return listBucket(s3); } ) .done(); } function settingBucket (bucketName, s3){ var deferred = Q.defer(); var s3 = new AWS.S3(); var params = { Bucket: bucketName, /* required */ }; s3.createBucket(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }).on('success',function(response) //put bucket cors for browsers javascript testing { var params = { Bucket: bucketName, /* required */ CORSConfiguration: { CORSRules: [ { AllowedHeaders: ['*',], AllowedMethods: ['GET','PUT','DELETE','POST'], AllowedOrigins: ['*','null'], ExposeHeaders: ['ETag',], }, ] }, }; s3.putBucketCors(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); console.log('put bucketcors succeed'); deferred.resolve(data); } }); }).send(); return deferred.promise; } function listBucket(s3) { var deferred = Q.defer(); s3.listBuckets(function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); console.log('we have '+data.Buckets.length.toString()+' buckets'); for (var i = data.Buckets.length - 1; i >= 0; i--) { console.log(data.Buckets[i].Name); }; deferred.resolve(data); } // successful response }); return deferred.promise; } function deleteBucket(bucketName, s3){ var deferred = Q.defer(); var params = { Bucket: bucketName, /* required */ }; s3.listObjectVersions(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else{ console.log(data); params = {Bucket: bucketName}; params.Delete = {}; params.Delete.Objects = []; // console.log(data.Versions.length); for(j = 0; j < data.Versions.length;++j) { params.Delete.Objects.push({Key: data.Versions[j].Key, VersionId: data.Versions[j].VersionId }); } for(j = 0; j < data.DeleteMarkers.length;++j) { params.Delete.Objects.push({Key: data.DeleteMarkers[j].Key, VersionId: data.DeleteMarkers[j].VersionId }); } s3.deleteObjects(params, function(err, data) { if (err) { console.log(err, err.stack); console.log('or has no objects');// an error occurred } else { console.log(data); } params = {Bucket: bucketName}; s3.deleteBucket(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); deferred.resolve(data); } }); }); } }); return deferred.promise; }
- 如何使用nodejs在亚马逊S3上传图像并将其公开
- 从AWS Lambda Node.JSstream式传输到S3
- 使用Mulder上传和redirect页面
- 如何使用node.js将pass-thru上传到Heroku上的s3?
- AWS S3 JavaScript SDK getSignedUrl仅返回基本path
- Node.js Amazon S3 – 下载失败,出现SignatureDoesNotMatch错误
- 使用Connect Multiparty,Jimp和Amazon s3fs节点模块将resize的照片上传到Amazon s3
- 如何使用nodejs将图像上传到s3时设置过期date
- 覆盖低级别的node.js模块