首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建对象的对象

创建对象的对象
EN

Stack Overflow用户
提问于 2017-08-30 15:47:28
回答 2查看 72关注 0票数 0

我试图在JS中创建一个对象对象,但我认为异步执行存在一些问题。

这是我的代码:

代码语言:javascript
运行
复制
// Extract data (episode number, characters firstname's) from .docx to JSON

var mammoth = require("mammoth")

function docx2Object (filepath) {
    
    return mammoth.extractRawText({path: filepath})
    .then(function (res) {
        return res.value;
    })
    .then(function (res) {
        let arr = {}
        arr["number"] = "" + res.match(/(?!Episode #)\d+/)
        arr["names"] = [...new Set(res.match(/^[^:\r\n]+(?=:)/gm))]
        return arr
    })
}

function files2JSON (arrayScripts) {
    
    let arr = {}
    let i = 0
    arrayScripts.forEach(function(element) {
        docx2Object(element).then(function (res) {
            arr[i++] = res
            console.log(JSON.stringify(arr, null, '\t'))
        })
    })
    return JSON.stringify(arr, null, '\t')
}

let arrayScripts = ["doc1.docx", "doc2.docx"]
console.log(files2JSON(arrayScripts))

这是输出:

代码语言:javascript
运行
复制
{}

{
    "0": {
        "number": "10600",
        "names": [
            "Hilary",
            "Jean-Claude",
            "Devon",
            "Jean Claude",
            "Cane",
            "Lily",
            "Jack",
            "Phyllis",
            "Victor",
            "Nikki",
            "Neil",
            "Paul",
            "Dr. Barrett",
            "Christine",
            "Kelly"
        ]
    }
}
{
    "0": {
        "number": "10600",
        "names": [
            "Hilary",
            "Jean-Claude",
            "Devon",
            "Jean Claude",
            "Cane",
            "Lily",
            "Jack",
            "Phyllis",
            "Victor",
            "Nikki",
            "Neil",
            "Paul",
            "Dr. Barrett",
            "Christine",
            "Kelly"
        ]
    },
    "1": {
        "number": "10601",
        "names": [
            "Hilary",
            "Devon",
            "Jean+Claude",
            "Jean + Claude",
            "Jean/Claude",
            "Jean / Claude",
            "Cane",
            "Lily",
            "Jack",
            "Phyllis",
            "Victor",
            "Nikki",
            "Neil",
            "Paul",
            "Dr. Barrett",
            "Christine",
            "Kelly"
        ]
    }
}

我的数组是空的,我的索引没有match.Can帮助?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-30 16:15:14

我想你的问题是

代码语言:javascript
运行
复制
arrayScripts.forEach(function(element) {
    docx2Object(element).then(function (res) {
        arr[i++] = res
        console.log(JSON.stringify(arr, null, '\t'))
    })
})

docx2Object调用是异步的,这意味着forEach的迭代将立即返回并执行。这意味着files2JSON可能在所有处理完成之前执行。

最有可能的是,您要做的是将每个承诺存储到一个数组中,然后使用Promise.all()一次性解析它们,然后从Promise.all()返回承诺并等待它。总的来说,它的结构应该类似于

代码语言:javascript
运行
复制
function asyncTask1(task) {
  return getPromise(task);
}

function asyncTask2() {
  var tasks = ["eat", "sleep"];
  var promises = tasks.map(function(task) {
    return asyncTask1(task);
  });
  return Promise.all(promises);
}

asyncTask2().then(function(response) {
  console.log("I ate and slept.");
});

在调试异步代码时,我个人做的第一件事就是抛出一大堆console.log,看看什么时候执行。这确实有助于了解处决的顺序。

Objects/Promise/all

票数 1
EN

Stack Overflow用户

发布于 2017-08-30 16:20:39

这将有助于获得您的output.As --您使用的是全局错误的增量计数以及包含错误代码的mammoth.extractRawText()方法。

代码语言:javascript
运行
复制
// Extract data (episode number, characters firstname's) from .docx to JSON
var mammoth = require("mammoth");

function docx2Object (filepath) {

  return mammoth.extractRawText({path: filepath})
      .then(function (res) {
        return res.value;
      }).then(function (res) {
        var arr = {};
        arr["number"] = "" + res.match(/(?!Episode #)\d+/);
        //arr["names"] = [...new Set(res.match(/^[^:\r\n]+(?=:)/gm))];
        return arr
      });

}

function files2JSON (arrayScripts) {
  var arr = {};

  arrayScripts.forEach(function(element,index) {
    docx2Object(element).then(function (res) {
      arr[index++] = res;
      console.log(res,index)
      console.log(JSON.stringify(arr, null, '\t'));
    })
  });
  return JSON.stringify(arr, null, '\t');
}

var arrayScripts = ["doc1.docx", "doc2.docx"];
console.log(files2JSON(arrayScripts));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45964757

复制
相关文章

相似问题

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