首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >promise中的fs.writeFile,异步同步的东西

promise中的fs.writeFile,异步同步的东西
EN

Stack Overflow用户
提问于 2015-08-13 10:04:40
回答 10查看 127.9K关注 0票数 101

我需要一些代码方面的帮助。我是Node.js的新手,对它有很多麻烦。

我想要做的是:

1)获取带有亚马逊产品(ASIN)的.txt;

2)使用amazon-product-api包拉取所有产品;

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

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

代码语言:javascript
复制
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);
        });
};
EN

回答 10

Stack Overflow用户

发布于 2018-08-30 17:56:03

截至2019年...

...the正确答案是将异步/等待与节点中包含的 一起使用。升级到Node.js 10或11 (已得到主要云提供商的支持)并执行以下操作:

代码语言:javascript
复制
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版本中,该功能未标记为实验版本。

代码语言:javascript
复制
import { promises as fs } from 'fs';

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

Stack Overflow用户

发布于 2016-02-05 04:38:24

因为fs.writefile是一个传统的异步回调--你需要遵循promise规范并返回一个新的promise,用一个解析和拒绝处理程序包装它,如下所示:

代码语言:javascript
复制
return new Promise(function(resolve, reject) {
    fs.writeFile("<filename.type>", data, '<file-encoding>', function(err) {
        if (err) reject(err);
        else resolve(data);
    });
});

因此,在您的代码中,您应该在调用.then()之后立即像这样使用它

代码语言:javascript
复制
 .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);
  });
票数 62
EN

Stack Overflow用户

发布于 2017-11-18 08:35:12

代码语言:javascript
复制
const util = require('util')
const fs_writeFile = util.promisify(fs.writeFile)

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

这比投票最多的答案更不容易出现错误。

票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31978347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档