承诺,如何将变量传递给 .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 函数的主要内容,如果未能解决你的问题,请参考以下文章