承诺,如何将变量传递给 .then 函数

Posted

技术标签:

【中文标题】承诺,如何将变量传递给 .then 函数【英文标题】:Promises, how to pass variable into .then function 【发布时间】:2017-07-16 19:24:58 【问题描述】:

您好,这是一个帮助我了解 Promises .then 返回如何工作的问题。 问题是:如何将变量范围限定为第二个 .then 链式函数?

这是一个jsbinhttp://jsbin.com/xacuna/edit?js,output

我可以访问全局变量,然后将作用域变量传递给第一个,而不是之后。

  let innerReturnFunction = (res, myName) => 
    /* this works */
    console.log(`hi from inner name: $myName`)
    return res
  

 let getInnerFuncVariable = () => 
   var myName = 'arturo'

   return fetch('https://httpbin.org/get')
    .then(function (res) 
      myName = 'Bob'
      return innerReturnFunction(res, myName);
    )
    .then(function (res, myName) 
      /* doesn't work, how can I access myName */
      console.log(`in first then $res.url, $myName`)
    );
 

getInnerFuncVariable().then(function(res, myName) 
  /* how can I access myName */
  console.log(`last called $myName`)
)

【问题讨论】:

then 中的回调只接受一个参数 - object 会很有用 见How to share prior results when chaining promises。 【参考方案1】:

当我遇到这个答案时,我正在尝试这样做:

for (key in updateDict)
 if ( ! key.startsWith("__"))
   var updateID        = updateDict[key].id;
    var updateNewValue  = updateDict[key].newValue;

    //store give the function call the ability to store the current value of key
    var storeAndDeleteKey = function(key, updateID, updateNewValue)
     return atStore.update("id":updateID, updateNewValue))
        .then
        ( (docs) => 
           results[key] = docs;
            delete updateDict[key];
          
       );
    

    //put the function with the current value of key into the Promise.all list
    dataAccessPromiseList.push
    ( storeAndDeleteKey(key, updateID, updateNewValue)
    )
  


if (dataAccessPromiseList.length > 0) dataAccessPromise = Promise.all(dataAccessPromiseList);

【讨论】:

【参考方案2】:

当您使用 ES2015 - 简单的解决方案使用 object Shorthand property names 和 Object destructuring

let innerReturnFunction = (res, myName) => 
    /* this works */
    console.log(`hi from inner name: $myName`);
    return res, myName; // return an object


let getInnerFuncVariable = () => 
    var myName = 'arturo';

    return fetch('https://httpbin.org/get')
        .then(function(res) 
            myName = 'Bob'
            return innerReturnFunction(res, myName);
        )
        .then(function(res, myName) 
            console.log(`in first then $res.url, $myName`);
            return res, myName;// ADD THIS!!
        );


getInnerFuncVariable().then(function(res, myName) 
    console.log(`last called $myName`)
)

【讨论】:

感谢您的回复。 then 中的回调只接受一个参数,因此将该参数包装为一个对象。我注意到 then 回调上的 .bind 允许您传入其他参数。 当然,既然可以使用 bind 使其过于复杂,为什么还要使用简单的更改 你说得对,bind让代码看起来更复杂一些。 @JaromandaX 在这种情况下,是的。但是如果你想传递一个在getInnerFuncVariable 函数之外声明的变量呢?那么bind()不是唯一的选择吗? 取决于我猜这个神话变量的范围

以上是关于承诺,如何将变量传递给 .then 函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 mySQL 和 nodejs 传递承诺

将已解决的承诺值传递到最终的“then”链的最佳方法是啥[重复]

你如何将 setTimeout 包装在一个承诺中[重复]

承诺解决并将道具传递给嵌套子项时如何更新Vue组件

如何将承诺的返回值分配给变量? [复制]

使用 Async 和 .then 承诺