gpt4 book ai didi

javascript - q.all 似乎表现不同,为什么?

转载 作者:行者123 更新时间:2023-12-03 12:12:17 25 4
gpt4 key购买 nike

这是我的代码,我希望它从顶部开始,然后继续向下执行。前两个子句从数据库中获取一条记录,然后更新“self”对象。然而,当执行到达 Q.all 时,该方法返回 Promises,而不是实际解析 Promise 并将值放入 locs(最终放入“self”)。最终, promise 将得到解决,但在最后一个 then 子句中的“return self”之后。我需要在运行“return self”之前设置 self.locations。

return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
return self.loadClientAppImpl(data);
}).then(function() {
locArray = self.app.field_194_raw;
return dao.getChildren("object_23", self.appId, "field_210", "field_164").then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
});
}).then(function() {
var locPromiseArray = getPromisesArray(locArray);
return Q.all(locPromiseArray).then(function(locs){
self.locations = locs;
});
}).then(function() {
return self;
}).done();

我认为多个 promise 也应该像单个调用 promise 一样?

即。 dao.getRecords 很好,但是为什么 Q.all([dao.getRecords1, dao.getRecord2 等]) 不能像我预期的那样工作(即在“返回 self ;”之前不解析)?

下面的代码工作正常,我用一个 promise 替换了 Q.all,一切都按预期工作(即返回链中最后调用的 self)。问题仍然存在:为什么 Q.all 的工作方式不一样?我假设这就是它应该工作的方式,但我不了解有关实现的一些内容。

return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
self.loadClientAppImpl(data);
}).then(function() {
locArray = self.app.field_194_raw;
return dao.getChildren("object_23", self.appId, "field_210", "field_164").then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
});
}).then(function() {
var locPromiseArray = getPromiseArray(locArray);
return locPromiseArray[0].then(function(locs){
self.locations = locs;
});
}).then(function() {
return self;
}).done();

这是 getPromisesArray 方法

function getPromiseArray (locArray) {
var locationCollection = "object_22";
//create a promise for all of the records
var locationPromiseArray = [];
if(locArray[0]){
var locId0 = locArray[0].id;
//dao.getRecord returns a promise
locationPromiseArray.push(dao.getRecord(locationCollection, locId0));
}

if(locArray[1]){
var locId1 = locArray[1].id;
locationPromiseArray.push(dao.getRecord(locationCollection, locId1));
}

if(locArray[2]){
var locId2 = locArray[2].id;
locationPromiseArray.push(dao.getRecord(locationCollection, locId2));
}

if(locArray[3]){
var locId3 = locArray[3].id;
locationPromiseArray.push(dao.getRecord(locationCollection, locId3));
}
return locationPromiseArray;
};

感谢您的帮助!

标记

PS。我注意到下面的代码的行为不同,并且我希望它以相同的方式工作。开始怀疑我是否发现了错误。在第一种情况下,“结果”填充了值(应该如此)。在第二种情况下,“结果”是一个 promise 。它们不应该以某种方式相同吗?

return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
self.loadClientAppImpl(data);
}).then(function() {
return dao.getChildren("object_23", self.appId, "field_210", "field_164");
}).then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
locPromiseArray = getPromiseArray(self.app.field_194_raw);
return Q.all(locPromiseArray).then(function(results){
self.locations = results;
return self;
});
});

return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
self.loadClientAppImpl(data);
}).then(function() {
return dao.getChildren("object_23", self.appId, "field_210", "field_164");
}).then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
locPromiseArray = getPromiseArray(self.app.field_194_raw);
return Q.all(locPromiseArray);
}).then(function(results){
self.locations = results;
return self;
});

最佳答案

很难理解为什么用单个 Promise 替换 Q.all(...) 可以得到所需的结果。您对正在发生的事情的分析可能不正确。

但是,这里有一些想法。

中链 .then() 不是必需的,除非它通过返回新的 Promise 或不同的值进行过滤。一个中链 .then() 的回调函数除了进行赋值操作外什么也不做,是 cut 的候选者。您有两个这样的作业。

  • self.priorCarriers = knackRecord.records;
  • self.locations = locs;

在这样的事情上很容易犯错误,但我认为你的主要代码块将重新排列如下:

return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
return self.loadClientAppImpl(data);
}).then(function() {
return dao.getChildren("object_23", self.appId, "field_210", "field_164");
}).then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
return Q.all(getPromisesArray(self.app.field_194_raw));
}).then(function(locs) {
self.locations = locs;
return self;
}).done();

请注意,赋值现在位于也返回某些内容的函数中,重要的是 self.locations = locs 位于返回 self 的同一函数中。这可能会或可能不会解决您的问题,尽管它很有前途[原文如此]。

郑重声明,getPromiseArray() 还应简化如下:

function getPromiseArray (locArray) {
return locArray.map(function(loc) {
return dao.getRecord("object_22", loc.id);
});
};

关于javascript - q.all 似乎表现不同,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com