javascript - 在 Promise 和函数之间传递变量

标签 javascript node.js promise

我有一个问题。 我必须执行两个不同的 SOAP 调用来检索两个凭单列表,然后使用这些列表对它们进行检查并完成一些工作。 我将这两个调用放在不同的 Promise 函数中,因为我想在调用返回结果后启动列表中的作业。 这是第一个 Promise 调用:

    let vouchers = function(voucherTypeList){
  return new Promise(function(resolve,reject){
    const categoryId = "1000";
    let args = {
      "tns:CategoryId": categoryId
    };
    var header = {
      "tns:Authenticate": {
        "tns:UserName": soapVoucherWsdlUsername,
        "tns:Password": soapVoucherWsdlPassword
      }
    };

    // let voucherTypeList;
    voucherClient.addSoapHeader(header);
    voucherClient.GetVouchers(args, function(err, result) {
      console.log("DENTRO GET VOUCHERS");
      if (err) {
        console.log(err);
        writeResponse(res, '200', err);
      } else {
        //++++++++++++++++++++++
        //voucherTypeList is what I want to return to the main function
        voucherTypeList = mapGetVoucherTypeListResponse(result);
        //++++++++++++++++++++++
      }
      resolve("done 1");
    });
  });
}

这是第二次 Promise 调用:

let issuedVouchers = function(accountId) {
  return new Promise(function (resolve, reject) {
    const categoryId = "1000";
    let args = {
      "tns:CategoryId": categoryId,
      "tns:CheckRedeem": true,
      "tns:IncludeRedeemed": false,
      "tns:CardId": accountId
    };
    var header = {
      "tns:Authenticate": {
        "tns:UserName": soapVoucherWsdlUsername,
        "tns:Password": soapVoucherWsdlPassword
      }
    };

    let issuedVoucherList;
    voucherClient.addSoapHeader(header);
    voucherClient.GetVouchers(args, function (err, result) {
      console.log("DENTRO GET ISSUED VOUCHERS");
      if (err) {
        console.log(err);
        writeResponse(res, '200', err);
      } else {
        //++++++++++++++++++++++
        //issuedTypeList is what I want to return to the main function
        issuedTypeList = mapGetVoucherTypeListResponse(result);
        //++++++++++++++++++++++    
      }
      resolve("done 2");
    });


  });
}

这是主要功能,带有 Promise 流程:

function getAvailableVoucherTypes(req, res) {
  var accountId = req.params.accountId;
vouchers(voucherTypeList).
    then(issuedVouchers(accountId)).
        then(function() {
        //here I want to use voucherTypeList and issuedTypeList
        //and do some jobs on them
        console.log("OK");
        });
}

我该怎么做?我尝试了很多解决方案,但在主函数中看不到 voucherTypeListissuedTypeList

最佳答案

then 回调获取您在 promise 中传递给 resolve 函数的值。您目前正在传递任意字符串,这是无用的...但是为了演示,让我们保留这些字符串并将它们的值记录在您的主脚本中:

function getAvailableVoucherTypes(req, res) {
  var accountId = req.params.accountId;
vouchers(voucherTypeList).
    then(function(result){
         console.log(result); //done 1
         return issuedVouchers(accountId);
    }).
        then(function(result) {
          console.log(result); //done 2
        //here I want to use voucherTypeList and issuedTypeList
        //and do some jobs on them
        console.log("OK");
        });
}

我会让你玩弄你的 promise 来传递正确的变量......

现在,您的 2 个调用似乎不需要按顺序进行,所以让我们将它们并行化,这对我们来说也会稍微容易一些。

function getAvailableVoucherTypes(req, res) {
  var accountId = req.params.accountId;
  var promises = [vouchers(),issuedVouchers(accountId)]
  Promise.all(promises).then(function(results){
      //In Promise.all, the results of each promise are passed as array
      //the order is the same as the order of the promises array.
      var voucherTypeList = results[0];
      var issuedTypeList = results[1];
  });
}

奖励:在您正确掌握之前,我不想让这项任务过于复杂。所以我不会添加更多代码。但请注意,你也应该使用 reject,而不是在每个 promise 中处理你的错误,你应该在出现问题时拒绝它们。只需 reject(err) 并向您的主脚本添加第二个回调,然后处理可能发生的任何错误。如果您继续解决无效的 promise ,您将不会传递您期望的元素,并且您需要对每个步骤添加检查。

让我们修改 GetVouchers 回调以适应我的建议。

voucherClient.GetVouchers(args, function (err, result) {
  console.log("DENTRO GET ISSUED VOUCHERS");
  if (err) {
    reject(err);
  } else {
    resolve(mapGetVoucherTypeListResponse(result));  
  }
});

完成您的两个 promise 后,我们可以更改您的主脚本以相应地处理错误。

Promise.all(promises).then(function(results){
   //Handle success like above.
},function(err){
   //Handle error.
    console.log(err.stack || err);
    writeResponse(res, '200', err);
});

关于javascript - 在 Promise 和函数之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213475/

相关文章:

javascript - 迭代数组并等待 promise

javascript - 如何在 ES6 中重试 Promise

javascript - 多个 GoogleMap javascript get 调用

javascript - 单击事件监听器正在调用我的函数,但前提是我将其传递给匿名函数

javascript - 模块和 require()

javascript - Winston 轮流写入多个文件

javascript - 找不到使用 Browserify 创建的模块

javascript - 取消回调函数的返回值

javascript - ExtJS4 时间轴上的标签

Node.js & Redis & For Loop with bluebird Promises?