Bluebird每个函数抛出TypeError

时间:2017-02-07 15:40:38

标签: javascript bluebird

您好我正在尝试了解下面的代码有什么问题。

代码:

    const Promise = require('bluebird')
    const fs = Promise.promisifyAll(require("fs"));

    var  config = {
      "files": [{
        "path1": "bla.js",
        "path2": "bla.js"
      }]
    }
    var baseDir ='./'
    function validateConfig(config) {
      return Promise.each(config.files, (file) => 
        Promise.each([file.path1, file.path2], (path) =>{
          fs.statAsync(baseDir+ path)
          console.log(baseDir + path)
        }

        )
      )
    }

validateConfig(config).then(config => validateConfig(config))

我不知道为什么会这样?如果有人可以解释它会很好。

TypeError: expecting an array or an iterable object but got [object Null]]

修改 我创建了一个自包含的示例来显示问题。 错误发生在最后一行

validateConfig(config).then(config => validateConfig(config))

这只是一个例子。通常我会在.then()

中调用另一种方法

1 个答案:

答案 0 :(得分:0)

你的问题是

.then(config => validateConfig(config));

它正在使用某种validateConfig对象回调config,该对象与您首先给出的const看起来不一样。

我解决了你的问题:

const Promise = require('bluebird')
const fs = Promise.promisifyAll(require("fs"));

const config = {
    "files": [{
        "path1": "bla.js",
        "path2": "bla.js"
    }]
};

const baseDir = './';

function validateConfig(config) {
    return Promise.all(
        config.files
            .reduce((fileList, file) => fileList.concat([file.path1, file.path2]), []) // this just gives you a list of files
            .map(path => fs.statAsync(baseDir + path)) // this returns the promises of stat'ing each file
    )
    .catch(err => {
        console.log(err);
    });
}

validateConfig(config)
    .then(statFiles => console.log(statFiles));