【问题标题】:can I add a parameter to my promise callback?我可以在我的承诺回调中添加一个参数吗?
【发布时间】:2023-04-10 22:17:02
【问题描述】:

我有一个需要一些外部数据的承诺回调。我怎样才能做到这一点?此代码中的 myDataINeed 始终为空。

var myDataVariable = "some dynamic data set above"; 
var promActions = [];
 for(var k in loop){
   promActions.push(externalCall(loop[k]));
 }
 var promResults = Promise.all(promActions);
 let myDataINeed = myDataVariable;
 promResults.then(function(responseArray, myDataINeed){
    ....do stuff with responseArray and myDataINeed
 });

编辑: 我向 myDataVariable 添加了一个值,因此您可以看到它已设置为某个值。 myDataINeed 不在 .then 函数的范围内。在promise期间我如何得到它。那么呢?

【问题讨论】:

  • .then 回调只接收一个参数,您不能只添加一个参数并期望承诺“知道您需要什么” - 此外,您显示的代码 myDataINeed 是可以在 .then 内部访问,因为它仍在范围内(只要您不使用代码中的参数“屏蔽”它)即从 .then 回调中删除参数,然后 presto chango,myDataINeed将是您需要的数据:ps在这段代码中,myDataINeed 将是 undefined 而不是 null(无论如何都在 .then 回调中)
  • @guest271314 - 我不知道你的评论对我意味着什么,但所有.then() 处理程序都得到一个参数。如果将那个参数设为对象,则可以在其上放置任意数量的属性,但只能得到一个参数。这就是 promise 规范的定义方式。 .then() 处理函数不能有两个或更多参数。
  • @guest271314 - 谁知道?这是一个不好的,不清楚的问题。正如声明的那样,变量在范围内并且可用。
  • @guest271314 appears myDataINeed is an asynchronous function call 根本不像函数调用

标签: javascript node.js angular typescript promise


【解决方案1】:

此代码中的myDataINeed 始终为空;

promise all 解析为单个数组值。所以promResults.then(function(responseArray, myDataINeed){ 是错误的。 promResults.then(function(responseArray){是对的。

更多

myDataINeed 需要来自某个外部来源,即不是来自Promise.all

【讨论】:

    【解决方案2】:

    如果您在调用then 的范围内已经有可用的数据,那么您无需执行任何特殊操作即可在then 内访问它。它将通过闭包的魔力提供。

    在您的问题尝试中,您实际上是在 隐藏 myDataINeed 变量,方法是将其声明为 then 回调中的参数,因此该值将始终未定义。

    要让它工作,您需要做的就是删除该参数:

    var myDataVariable = "some dynamic data set above"; 
    var promActions = [];
    for(var k in loop){
       promActions.push(externalCall(loop[k]));
    }
    var promResults = Promise.all(promActions);
    let myDataINeed = myDataVariable;
    promResults.then(function(responseArray){  // <-- remove the myDataINeed parameter
        ....do stuff with responseArray and myDataINeed
    });
    

    在单独的注释中,如果loop 是一个数组(我认为它是),那么使用该循环就会出现问题,并且与承诺无关。您不应该将 for .. in 与数组一起使用。如果它确实是一个数组,您可以使用.map 简洁地完成您想要做的事情:

    var myDataVariable = "some dynamic data set above"; 
    var promActions = loop.map(externalCall);
    var promResults = Promise.all(promActions);
    let myDataINeed = myDataVariable;
    promResults.then(function(responseArray){  // <-- remove the myDataINeed parameter
        ....do stuff with responseArray and myDataINeed
    });
    

    【讨论】:

      猜你喜欢
      • 2017-05-07
      • 2015-10-16
      • 2021-05-20
      • 2011-01-31
      • 2012-12-08
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      相关资源
      最近更新 更多