承诺中的 fs.writeFile,异步同步的东西

新手上路,请多包涵

我的代码需要一些帮助。我是 Node.js 的新手,遇到了很多麻烦。

我正在尝试做的事情:

  1. 获取包含亚马逊产品 (ASIN) 的 .txt;

  2. 使用 amazon-product-api 包获取所有产品;

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

我的代码不起作用。我想我搞砸了这个异步同步的东西 - 帮帮我!

 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];

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

原文由 Markus Schmidlich 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 720
1 个回答

截至2019年…

…正确的答案是将 async/await 与 本机 fs 包含在 node 中的承诺模块 一起 使用。升级到 Node.js 10 或 11(主要云提供商已支持)并执行以下操作:

 const fs = require('fs').promises;

// This must run inside a function marked `async`:
const file = await fs.readFile('filename.txt', 'utf8');
await fs.writeFile('filename.txt', 'test');

不要使用第三方包,也不要编写自己的包装器,这已经没有必要了。

不再是实验性的

在 Node 11.14.0 之前,您仍然会收到警告,指出此功能是实验性的,但它工作得很好,这是未来的发展方向。自 11.14.0 以来,该功能不再是实验性的,可以投入生产。

如果我更喜欢 import 而不是 require 怎么办?

它也有效——但仅适用于此功能未标记为实验性的 Node.js 版本。

 import { promises as fs } from 'fs';

(async () => {
    await fs.writeFile('./test.txt', 'test', 'utf8');
})();

原文由 user6269864 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题