如何在promise链中传递参数

时间:2016-12-09 20:44:18

标签: javascript node.js

我真的被承诺在承诺之间传递价值,我想知道我是否可以在这里得到帮助。 我在CustomerRepo中有一个CustomerController调用方法

let getCustomers = customerRepo.getCustomers(req.query.offset, req.query.return);
let getProfiles  = customerRepo.getProfiles(rows);

getCustomers
   .then(function (rows) {
        console.log(rows[0]);
    })
    .then(getProfiles)

我不知道如何将行(客户数组)传递给getProfiles,因此我可以使用配置文件填充客户对象。 以下是CustomerRepo中的代码 -

var getCustomers = function (offset, _return) {
  return new Promise(function (resolve, reject) {
    var sqlString = 'call qsel_customers' + '(' + offset + ',' + _return + ')';
    pool.getConnection(function (err, connection) {
        if (err) {
            return reject(err);
        }
        connection.query(sqlString, function (err, rows) {
            if (err) {
                reject(err);
            }
            else
                resolve(rows);
            connection.release();

        });
        connection.on('error', function (err) {
            res.json({"code": 100, "status": "Error in connection database"});
        });
    });

  });
}

和getProfiles

 var getProfiles = function (rows) {
  return new Promise(function (resolve, reject) {
     console.log(rows);
  }
}

我得到的行未定义。还有人可以建议我如何将db mysql连接代码提取到dbConnect.js中,以避免代码重复。

3 个答案:

答案 0 :(得分:2)

Promise表示在某个时间点可能失败或不失败的计算。因此,为了创建一个Promise,你可以:

return new Promise(function(resolve, reject) {
  // here you decide when the computation fails and when succeeds
  resolve(1) // success
  reject('error') // failed
})

Promise有一种叫做then的方法(确实是一种瑞士刀)。它需要一个参数的函数f。现在,ƒ的魔力看起来像这样:

  • 如果ƒ返回简单值(字符串,数字,数组等),那么它会将其包装在新的Promise中并返回它。签名是then : Promise[a] -> (a -> b) -> Promise[b]。因此,假设你有一个函数∂返回一个数字的Promise,ƒ取一个数字并添加“!”对它,你得到这个数字,用then传递给ƒ并最终得到一个新的承诺:

    ƒ.then(n => n +'!')//承诺[String]

  • 如果ƒ返回一个Promise,那么then将“提取”该值,如果这个Promise,将它传递给∂并返回一个带有结果的新Promise。在伪代码中:

    ƒ.then(n => Promise(n +'!'))//承诺[String]

好的,then会返回一个承诺。好吧,让我们设计一下代码:

let getCustomers = () => Promise.resolve([ {}, {}, {} ])
// assume myApi.getProfile takes a Customer and returns a Profile
let getProfiles = (customers) => customers.map(myApi.getProfile)
getCustomers().then(getProfiles).then(console.log.bind(console));

答案 1 :(得分:1)

我不是Promises的专家,但我不认为将pool.getConnection放在getCustomers承诺中是个好主意。 它看起来像是另一个承诺,应该被链接而不是合并。

回到你的主要版本。你可以这样做

getCustomers
.then(function (rows) {
 return getProfiles(rows); 
})
.then(function() {
console.log('get profiles resolved');
});

 var getProfiles = function (rows) {
  return new Promise(function (resolve, reject) {
     resolve(rows);
     console.log('other log of rows:' + rows);
  }
}

<强>编辑:

let getCustomers = customerRepo.getCustomers(req.query.offset, req.query.return);
let getProfiles  = customerRepo.getProfiles;

getCustomers
   .then(function (rows) {
        return getProfiles(rows);
    })
    .then(function(rows) {
     console.log('rows number ' + rows);
     console.log('get profiles resolved');           
     );

答案 2 :(得分:1)

当链接Promises时,你必须返回一个Promise,它使用你从上游函数传递的值来解析,以便在下游函数中使用它。

getCustomers
  .then(function (rows) {
    console.log(rows[0]);
    return Promise.resolve(rows[0]);
  })
  .then(function(firstRow) {
    console.log("The first row's id is " + firstRow.id);
    return Promise.resolve(firstRow);
  })
  .then(getProfiles);

如果需要在其中一个函数中执行异步工作,请返回一个新的Promise并在异步回调中适当地调用resolve / reject函数。 Promise.resolve()是您可以使用的快捷方式,如果您没有异步执行任何操作;它只返回一个Promise对象,该对象用它传递的值解析。

相关问题