在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; }