Javascript 然后,Java脚本链接将丢失此脚本的上下文
我被Java脚本中的.then链接弄得乱七八糟。试图找出答案无法解决以下问题 我努力实现的目标是: 我有两个数组this.arrayA和this.arrayB,function和funcitonB分别填充它们,然后我想在funcitonC中使用这两个数组Javascript 然后,Java脚本链接将丢失此脚本的上下文,javascript,promise,Javascript,Promise,我被Java脚本中的.then链接弄得乱七八糟。试图找出答案无法解决以下问题 我努力实现的目标是: 我有两个数组this.arrayA和this.arrayB,function和funcitonB分别填充它们,然后我想在funcitonC中使用这两个数组 return functionA(this) //returns promise resolve , populates this.arrayA .then(functionB(this)) //returns promise resolv
return functionA(this) //returns promise resolve , populates this.arrayA
.then(functionB(this)) //returns promise resolve , populates this.arrayB
.then(functionC(this)) //returns promise rejected if condition=true else resolves promise
我试图通过如下分配来传递“this”上下文,但我总是松开引用,在functionB中我总是得到function的输出。我尝试了下面的代码,但它不起作用
var self = this;
return functionA(this) //returns promise resolve , populates this.arrayA
.then(functionB.bind(self)) //returns promise resolve , populates this.arrayB
.then(functionC.bind(self)) //returns promise rejected if condition=true else resolves promise
var _ = require('loadash');
functionA(that){
return new Promise(function(resolve, reject) {
resolve(
_.each(that.items1, function(item1){
var someStruct = {
name: item1.name,
type: item1.type
}
that.arrayA.push(someStruct);
}
)
});
}
functionB(that){
return new Promise(function(resolve, reject) {
resolve(
_.each(that.items2, function(item2){
var someStruct = {
name: item2.name,
type: item2.type
}
that.arrayB.push(someStruct);
}
)
});
}
functionC(that){
return new Promise(function(resolve, reject){
_.each(that.arrayA, function(someItems){
_.find(that.arrayB , function(someMoreItems){
if (someItem.name === someMoreItems.name && someItem.type != someMoreItems.type){
reject(Error("it's broken"))
}else{
resolve()
}
});
});
});
}
你能教育我解决这个问题吗
谢谢将上下文
存储到变量中,并每次使用该变量。尝试向Promise
构造函数发送函数而不是对象
因此,与其
new Promise({})
你需要
new Promise(function(){})
更新-猜测2:
您正在将函数的外部this
绑定到this
,但从未使用过。您希望绑定第一个参数,而不是此
试着改变
functionX.bind(self)
进入
上述代码的另一个问题是如何在functionC中解决和拒绝承诺。因为一旦你为Promise设置了一个状态,它在函数C的情况下就不会改变。有几次迭代已经设置了要解析的Promise,而满足if语句无法设置的条件是再次拒绝()。因此,我设置了一个布尔标志,并在两个循环之外计算了该标志。我还需要返回
承诺状态,只是设置它不会返回它
return functionA(this) //returns promise resolve , populates this.arrayA
.then(functionB.bind(this)) //returns promise resolve , populates this.arrayB
.then(functionC.bind(this)) //returns promise rejected if condition=true else resolves promise
functionA(that){
self.arrayB = [];
return new Promise(function(resolve, reject) {
_.each(that.items1, function(item1){
var someStruct = {
name: item1.name,
type: item1.type
}
resolve(that.arrayA.push(someStruct));
}
});
}
functionB(){
var self = this;
self.arrayB = [];
return new Promise(function(resolve, reject) {
_.each(self.items2, function(item2){
var someStruct = {
name: item2.name,
type: item2.type
}
resolve(self.arrayB.push(someStruct));
}
});
}
functionC(){
var self = this;
var promiseStatus = false;
return new Promise(function(resolve, reject){
_.each(self.arrayA, function(someItems){
_.find(self.arrayB , function(someMoreItems){
if (someItem.name === someMoreItems.name && someItem.type != someMoreItems.type){
promiseStatus = true;
}
});
});
if (promiseStatus){return reject(Error('it broken'))}
else {return resolve();}
});
}
没有看到每个函数的作用,谁能说出问题所在。。。第一个代码段注定要失败,因为所有函数都被立即调用。。。第二个代码段看起来可以工作(顺便说一句,您甚至不需要self-var,只需将每个函数绑定到this
,这与您在第一个代码段中所做的不同),但是没有看到函数的功能,谁知道如何使用函数C
和B与A的代码来了解真正的功能happening@JaromandaX我现在已经更新了所有函数的代码您不能有一个名为this
的函数参数。。。你能吗?变量也会在函数后释放上下文。我每次都会丢失上下文这个,但你是对的,在每个函数中都将其分配给变量完成了任务。我只在函数调用开始时分配了一次。这只是一个猜测,因为你没有向我们提供完整的示例。另外,您应该标记示例使用的所有库(如下划线)。是的,语法方面您是对的。我确实使用了new Promise(function(){}),但在上面的代码段中遗漏了它。但这并没有什么区别。请检查另一个问题的答案。
return functionA(this) //returns promise resolve , populates this.arrayA
.then(functionB.bind(this)) //returns promise resolve , populates this.arrayB
.then(functionC.bind(this)) //returns promise rejected if condition=true else resolves promise
functionA(that){
self.arrayB = [];
return new Promise(function(resolve, reject) {
_.each(that.items1, function(item1){
var someStruct = {
name: item1.name,
type: item1.type
}
resolve(that.arrayA.push(someStruct));
}
});
}
functionB(){
var self = this;
self.arrayB = [];
return new Promise(function(resolve, reject) {
_.each(self.items2, function(item2){
var someStruct = {
name: item2.name,
type: item2.type
}
resolve(self.arrayB.push(someStruct));
}
});
}
functionC(){
var self = this;
var promiseStatus = false;
return new Promise(function(resolve, reject){
_.each(self.arrayA, function(someItems){
_.find(self.arrayB , function(someMoreItems){
if (someItem.name === someMoreItems.name && someItem.type != someMoreItems.type){
promiseStatus = true;
}
});
});
if (promiseStatus){return reject(Error('it broken'))}
else {return resolve();}
});
}