在承诺fs.writeFile,asynchronous同步的东西

我需要一些帮助我的代码。 我是nodejs的新手,遇到很多麻烦。 我在做什么:

  • 1)使用Amazon产品(ASIN's)获取.txt文件
  • 2)使用amazon-product-api软件包获取所有产品

  • 3)将每个产品保存在.json文件中

我的代码不工作。 我想我搞砸了这个asynchronous同步的东西 – 帮助我!

var amazon = require('amazon-product-api'); var fs = require('fs'); var client = amazon.createClient({ awsId: "XXX", awsSecret: "XXX", awsTag: "888" }); var array = fs.readFileSync('./test.txt').toString().split('\n'); for (var i = 1; i < array.length; i++) { var ASIN = array[i]; return client.itemLookup({ domain: 'webservices.amazon.de', responseGroup: 'Large', idType: 'ASIN', itemId: ASIN }) .then(function(results) { fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { if (err) { console.log(err); } else { console.log("JSON saved"); } }) return results; }).catch(function(err) { console.log(err); }); }; 

因为fs.writefile是一个传统的asynchronouscallbackfs.writefile – 你需要遵循promise规范,并返回一个新的promise,它包含一个parsing和拒绝处理器,如下所示:

 return new Promise(function(resolve, reject) { fs.writeFile("<filename.type>", data, '<file-encoding>', function(err) { if (err) reject(err); else resolve(data); }); }); 

所以在你的代码中,你可以在调用.then()之后使用它。

  .then(function(results) { return new Promise(function(resolve, reject) { fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { if (err) reject(err); else resolve(data); }); }); }).then(function(results) { console.log("results here: " + results) }).catch(function(err) { console.log("error here: " + err); }); 

2017年9月 更新fs-promise已被弃用,转而使用fs-extra


我没有使用它,但你可以看看fs-promise 。 这是一个节点模块:

代理所有asynchronousfs方法将它们暴露为Promises / A +兼容的promise(when,Q等)。 将所有同步方法作为值传递。

 const util = require('util') const fs_writeFile = util.promisify(fs.writeFile) 

https://nodejs.org/api/util.html#util_util_promisify_original

这个问题比顶尖答案更不容易出错

为了方便使用asynchronous转换所有callback,以保证使用一些库,如“蓝鸟”。

  .then(function(results) { fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { if (err) { console.log(err); } else { console.log("JSON saved"); return results; } }) }).catch(function(err) { console.log(err); }); 

尝试解决scheme(蓝鸟)

 var amazon = require('amazon-product-api'); var fs = require('fs'); var Promise = require('bluebird'); var client = amazon.createClient({ awsId: "XXX", awsSecret: "XXX", awsTag: "888" }); var array = fs.readFileSync('./test.txt').toString().split('\n'); Promise.map(array, function (ASIN) { client.itemLookup({ domain: 'webservices.amazon.de', responseGroup: 'Large', idType: 'ASIN', itemId: ASIN }).then(function(results) { fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { if (err) { console.log(err); } else { console.log("JSON saved"); return results; } }) }).catch(function(err) { console.log(err); }); });