gpt4 book ai didi

javascript - 将 Promise 与之前的结果链接起来

转载 作者:行者123 更新时间:2023-12-01 02:29:05 25 4
gpt4 key购买 nike

我正在尝试访问 promise 中先前的结果,如此处概述的 How do I access previous promise results in a .then() chain?

我已经成功地使用 2 个 Promise 来实现此功能,但是当我添加第三个向 API 发出 POST 请求时,Promise 结果是我的发布请求,而不是该发布请求的响应。

我的应用程序的流程基本上是。我将一个项目插入数据库。然后,我使用该 insertId 将多个项目插入到数据库中,这些项目是第一个 insertId 的“子项”。但我还需要将这些值发送到 API。然后,这个 API 将返回另一个 ID,我最终将其与我自己之前的 insertID 关联起来。代码大致如下(为了简洁起见,我删除了一些其他逻辑和错误处理)。

let name = req.body.name;
let value = req.body.values;
let obj = {name:name};
let entries = [];
let a = db.items.insertItem(name);

let b = a.then((data) => {
let insertId = data.insertId;
let promises = [];
values.forEach((val) => {
entries.push({value:val)})
promises.push( db.values.insertValuesForItem(insertId,val));
})
obj.entries = entries;
return promises;

})
let c = b.then((data) => {
return request.post(constants.devUrl,
{
headers:{
'Authorization': 'bearer ' + constants.developerToken,
'content-type': 'application/json'
},
json:obj
});
});

Promise.all([a,b,c]).then(([resa,resb,resc]) => {
//resc here contains the post request info e.g the post data and headers
// what I really want from resc is the response from my post request
res.redirect(200,'/items/' + resa.insertId);
})

正如我之前提到的,在 resc 中,我实际上需要 API 请求的响应,而不是请求本身的详细信息。我有什么想法可以实现这一目标吗?

最佳答案

现在问题已重新提出,重申我在评论中所说的话:

您的代码中有两个问题:

  1. 错误地链接 promise :

    let b = a.then((data) => {
    let insertId = data.insertId;
    let promises = [];
    values.forEach((val) => {
    entries.push({value:val)})
    promises.push( db.values.insertValuesForItem(insertId,val));
    })
    obj.entries = entries;
    return promises; // this variable is accessed later as `data`, but
    // never actually used => it's pointless

    })

    自从你回来promises ,您实际上返回的是 Promise 只有在实现时,才会返回您的一系列 promise 。这意味着:

    1. b 内成功回调,您将得到 data (这是 promises 数组)但不对其进行任何操作。
    2. 里面Promise.all([a,b,c]).then(([resa,resb,resc]) , resb是 promise 数组,而不是 db 的结果执行。

    我知道您正在尝试同步执行,但这不是正确的方法。

  2. 错误地期待 request.post返回 promise :

    let c =  b.then((data) => {
    return request.post(constants.devUrl,
    {
    headers:{
    'Authorization': 'bearer ' + constants.developerToken,
    'content-type': 'application/json'
    },
    json:obj
    });
    });

    正如您在评论中提到的,您正在使用 this requests lib 。因此,c在这种情况下,确实是 Promise ,但其返回值不是 httpResponse正如你所期望的。

    • 如果您想与 requests 合作为了让它返回 promise ,您需要使用 these variances of the requests lib 之一,这是返回的 promise 。

    • 但是,如果您不想更改库,则可以通过传递 post 的回调函数来同步执行。方法。例如

      var gotResponseCallBack = function(err, httpResponse, body){
      return httpResponse;
      }
      request.post(constants.devUrl,
      {
      headers:{
      'Authorization': 'bearer ' + constants.developerToken,
      'content-type': 'application/json'
      },
      json:obj
      }, gotResponseCallBack);

关于javascript - 将 Promise 与之前的结果链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48457137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com