在承诺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); }); });