2017-04-19 30 views
0

我正在嘗試使用類1給出的值來查找類2中與類1的值相關的更多值。我打算通過循環k的值來做到這一點,但是,無論我在哪裏放置循環,它都只使用k的最終值。任何人都可以告訴我在處理承諾時如何處理索引的必要性?我對承諾和解析都很陌生。編輯:如果支架錯位。已編入索引的Javascript解析承諾循環

var Class1 = Parse.Object.extend("Class1"); 
var Class2 = Parse.Object.extend("Class2"); 

Parse.Promise.as().then(function() { 

    var query = new Parse.Query(Class1); 
    return query.find() 

    }).then(function (class1IDs) { 
    for (var k = 0; k < class1IDs.length; k++) { 

     var class1IDEntry = class1IDs[k]; 
     var class1ID = class1IDEntry.id; 

     Parse.Promise.as().then(function() { 
     var class1 = new Class1(); 
     class1.id = class1ID; 

     var query = new Parse.Query(Class2); // 
     query.equalTo("class1", class1); 
     return query.find() 

     }).then(function (class2IDs) { 
     var stuff; 
     }); 
    } 

    }).then(function() { 
    done(); 
    }, function(error) { 
    console.log(error); 
    done(new Error(error)); 
    }); 
}); 
+0

我認爲這是因爲承諾是異步的?如果是這樣,有沒有辦法阻止一端而另一端向前循環? – RWDJ

回答

0

要等到內部創建的for循環來完成所有的承諾,在done()通話權之前 - 宜循環運行中串聯或並聯的疑問?你有另一個問題是由於代碼的異步性,所有class1.id = class1ID將有最後一個項目的class1IDclass1IDs(如您懷疑)連續流經class1IDs

貫穿class1IDs在

var Class1 = Parse.Object.extend("Class1"); 
var Class2 = Parse.Object.extend("Class2"); 

Parse.Promise.as().then(function() { 
    var query = new Parse.Query(Class1); 
    return query.find() 
}).then(function(class1IDs) { 
    return class1IDs.reduce(function(promise, class1IDEntry) { 
     var class1ID = class1IDEntry.id; 
     var class1 = new Class1(); 
     class1.id = class1ID; 
     var query = new Parse.Query(Class2); // 
     query.equalTo("class1", class1); 
     return promise.then(function() { 
      return query.find(); 
     }).then(function(class2IDs) { 
      var stuff; 
     }); 
    }, Parse.Promise.as()); 
}).then(function() { 
    done(); 
}, function(error) { 
    console.log(error); 
    done(new Error(error)); 
}); 

運行並行

var Class1 = Parse.Object.extend("Class1"); 
var Class2 = Parse.Object.extend("Class2"); 

Parse.Promise.as().then(function() { 
    var query = new Parse.Query(Class1); 
    return query.find() 
}).then(function(class1IDs) { 
    return Parse.Promise.when.apply(null, class1IDs.map(function(class1IDEntry) { 
     var class1ID = class1IDEntry.id; 
     var class1 = new Class1(); 
     class1.id = class1ID; 
     var query = new Parse.Query(Class2); // 
     query.equalTo("class1", class1); 
     return query.find() 
     .then(function(class2IDs) { 
      var stuff; 
     }); 
    })); 
}).then(function() { 
    done(); 
}, function(error) { 
    console.log(error); 
    done(new Error(error)); 
}); 
+0

謝謝!第一個爲我正在做的事情工作。 – RWDJ