Javascript 如何在承诺数组中引用对象值?
下面的对象包含查找键,其中包含一个数组,用于对Javascript 如何在承诺数组中引用对象值?,javascript,arrays,object,promise,Javascript,Arrays,Object,Promise,下面的对象包含查找键,其中包含一个数组,用于对值运行一系列验证 如何从电子邮件访问全名的值 const-config={ 全名:[ val=>新承诺((解决,拒绝)=>解决(val)), val=>新承诺((解决,拒绝)=>解决(val)) ], 电邮:[ val=>新承诺((解决,拒绝)=>解决(val)), val=>newpromise((resolve,reject)=>reject(`${config.full\u name.val}`))//获取已传递给full\u name的值 ]
值
运行一系列验证
如何从电子邮件
访问全名
的值
const-config={
全名:[
val=>新承诺((解决,拒绝)=>解决(val)),
val=>新承诺((解决,拒绝)=>解决(val))
],
电邮:[
val=>新承诺((解决,拒绝)=>解决(val)),
val=>newpromise((resolve,reject)=>reject(`${config.full\u name.val}`))//获取已传递给full\u name的值
]
}
config.full\u name.val
不存在,因为config.full\u name
是一个包含返回承诺的函数的数组
这里的用例取决于如何调用这些函数的上下文。此处解释了此上下文:
还考虑到验证部分与实际配置位于不同的模块中,因此不能简单地访问回调中的formData
但是,您可以向函数回调中添加上下文参数,以提供要访问的formData,如下所示:
请参见这一行(在验证器fn中):
这基本上提供了formData作为上下文参数,可在以后使用:
(val, ctx) => new Promise((resolve, reject) => setTimeout(() => {
reject(`${ctx.name} already is exists.`) // simulate a HTTP request
}, 2000))
您还可以实现如下类似的功能:
函数提示器(val,pass=true){
返回新承诺(函数(v,x){
回程通行证?v(val):x(val);
});
}
var config={full_name:[promisifier,promisifier],
电子邮件:[承诺人,承诺人]
};
配置全名[0](“Thaddeus Jones”)
.then(r=>config.email[1](r,false))
.then(r=>console.log(“解析者:”,r))
.catch(e=>console.log(“接收到的错误:”,e))代码>应该是这样的。但是它是全名
不是全名
。谢谢,我已经调整了,没有。。这不起作用。谢谢,这是一个很好的解决方案,尽管我希望能够在不必解决承诺的情况下引用val
。根据您的建议,config.full_name
需要解析val
。我已修改了我的问题,以返回传递给每个承诺的值,您的解决方案将失败,因为full\u name
传递的是一个空值。我也知道config.full\u name.val
不可能,但将其用作我希望在电子邮件
数组中实现的一个示例。那么,您到底想用它实现什么呢?如果没有这个配置如何使用的上下文,很难理解。您是否在调用电子邮件函数之前调用全名函数,并且希望传递到该函数的值稍后可用(例如,当电子邮件承诺完成时?)在这种情况下,您已经可以访问formData-例如,只需使用formData.name这是一种有趣的方法。虽然数组中的每个承诺都将执行不同的操作。@Karl Bateman为了清楚起见,我使用了一个虚拟承诺器,不重复承诺返回函数。如果在实际代码中,您的数组项是承诺返回实体,那么此模式应该可以正常工作。感谢您的回答,我需要在config
的上下文中访问该值,这实际上是一个模块,因为可以根据输入加载各种配置。有关示例用例,请参见。
(val, ctx) => new Promise((resolve, reject) => setTimeout(() => {
reject(`${ctx.name} already is exists.`) // simulate a HTTP request
}, 2000))