如何在 promise join 中调用新对象

How to call to new object in promise join

我使用 promise join,我需要使用将数据从 readFile 发送到 myFacade (src),我的 facade 将 obj 发送到 getA,后者将发送到 arg[0]...

run = function (filePath) {
    return Promise.join(
        fs.readFileAsync(filePath, 'utf8')
            .then(myFacade)
            .then(getA),
        users.getUsersAsync(usersObj)
            .then(users.modifyRec.bind(null, process.env.us))
    ).then(function (args) {
            return runProc('run', args[0], args[1]);
....

要使这项工作不在承诺中,您应该做类似

的事情
  var parsed = new MyFacade(str);
   var attribute = parsed.getA()

这是应该调用的代码

var yaml = require('yamljs');

function MyFacade(src) {
  this.data = yaml.parse(src);
}

MyFacade.prototype = {

  getA: function () {
    return this.data.def_types.web;
  },

  getB: function () {
    return this.data.conars;
  }

};

module.exports = MyFacade;

如何让它与上面的承诺链一起工作?

您正在使用

.then(getA)

意思是"call the function getA on the result of the previous promise."但是你没有函数getA;先前承诺的结果有一个方法getA。你想要 call:

.call('getA')

至于

.then(myFacade)

有两种选择。一个是添加到构造函数中的常见事物:

function MyFacade(src) {
  if(!(this instanceof MyFacade)) return new MyFacade(src);
  this.data = yaml.parse(src);
}

这允许在没有 new 的情况下调用构造函数。或者,您可以将匿名函数传递给 then:

.then(function(str) {
  return new MyFacade(str);
})

只需准确传递您在没有承诺的情况下使用的代码作为回调:

return Promise.join(
    fs.readFileAsync(filePath, 'utf8')
        .then(function(str) {
            var parsed = new MyFacade(str);
            var attribute = parsed.getA()
            return attribute;
        }),
    users.getUsersAsync(usersObj)
        .then(users.modifyRec.bind(null, process.env.us)),
function(attr, rec) {
    return runProc('run', attr, rec);
});