Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 然后,Java脚本链接将丢失此脚本的上下文_Javascript_Promise - Fatal编程技术网

Javascript 然后,Java脚本链接将丢失此脚本的上下文

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

我被Java脚本中的.then链接弄得乱七八糟。试图找出答案无法解决以下问题

我努力实现的目标是: 我有两个数组this.arrayA和this.arrayB,function和funcitonB分别填充它们,然后我想在funcitonC中使用这两个数组

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();}
 });
 }