Javascript 如何在承诺链中传递参数

Javascript 如何在承诺链中传递参数,javascript,node.js,Javascript,Node.js,我真的很难在承诺之间传递价值观,我想知道我是否能在这里得到帮助。 我有一个CustomerController在CustomerRepo中调用方法 let getCustomers = customerRepo.getCustomers(req.query.offset, req.query.return); let getProfiles = customerRepo.getProfiles(rows); getCustomers .then(function (rows) {

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

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,以便用概要文件填充customers对象。 以下是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中,以避免代码重复。

我不是承诺方面的专家,但我认为将
pool.getConnection
放在
getCustomers
承诺中不是一个好主意。 这看起来像是另一个承诺,应该被捆绑起来,而不是结合起来

回到你的主要问题上来。你可以这样做

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

编辑:

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');           
     );

我不是承诺方面的专家,但我不认为将
pool.getConnection
放在
getCustomers
承诺中是个好主意。 这看起来像是另一个承诺,应该被捆绑起来,而不是结合起来

回到你的主要问题上来。你可以这样做

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

编辑:

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');           
     );

链接承诺时,必须返回一个承诺,该承诺使用从上游函数传递的值进行解析,以便在下游函数中使用它

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);

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

链接承诺时,必须返回一个用从上游函数传递的值解析的承诺,才能在下游函数中使用它

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);

如果需要在其中一个函数中执行异步工作,请返回一个新的承诺,并在异步回调中适当地调用resolve/reject函数
Promise.resolve()
是一种快捷方式,如果您不异步执行任何操作,可以使用它;它只返回一个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
。它采用一个参数的函数。现在,ƒ的魔力是这样的:

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

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

  • 如果ƒ返回一个承诺,则
    然后
    将“提取”该承诺的值,如果该承诺传递给∂ 并返回一个新的承诺和结果。在伪代码中:

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

好的,
然后
返回一个承诺。那么,让我们设计代码:

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));

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
。它采用一个参数的函数。现在,ƒ的魔力是这样的:

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

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

  • 如果ƒ返回一个承诺,则
    然后
    将“提取”该承诺的值,如果该承诺传递给∂ 并返回一个新的承诺和结果。在伪代码中:

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

好的,
然后
返回一个承诺。那么,让我们设计代码:

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));

而不是
。然后(getProfiles)
。然后(function(){getProfiles(…)})
@marekful你是这个意思。然后(function(){getProfiles(rows)}?而不是
。然后(getProfiles)
。然后(function(){getProfiles(…)})
@marekful你是这个意思。然后(function(){getProfiles(rows)}),我真的觉得编码承诺非常令人困惑,我想定下一个版本的承诺代码的工作。有没有办法将sql查询抽象为承诺?特别是在链接多个查询时?假设您使用ES6,您最好使用
产生
多个查询。我很欣赏您的评论,我真的觉得编码承诺非常令人困惑,我想确定一个有效的承诺代码版本。有没有办法将sql查询抽象为承诺?尤其是在链接多个查询时?假设您使用ES6,您可能会更好地使用
产生
多个查询。我明白为什么我会感到困惑,尤其是对于初学者,有很多方法可以做同样的事情。我希望我能找到一个详细的博客/图坦卡蒙来浏览它。不管怎样,这实际上是一个糟糕设计的问题:映射、链接、错误映射的唯一方法。。。我希望,我的帖子是有帮助的。顺便说一句,这里有一个很好的教程。谢谢伊万,是的,非常有帮助。我明白为什么我会感到困惑,特别是对于初学者来说,做同样的事情有很多方法。我希望我能找到一个详细的博客/图坦卡蒙来浏览它。无论如何,谢谢你,是的,这实际上是一个糟糕设计的问题:遇到的那个