- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码,我希望它从顶部开始,然后继续向下执行。前两个子句从数据库中获取一条记录,然后更新“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 的候选者。您有两个这样的作业。
在这样的事情上很容易犯错误,但我认为你的主要代码块将重新排列如下:
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/
例子一 function first(a, b) { return a + b; } function second() { return Math.floor(Math.sqrt(a
我想证明或证伪forall (P Q : Prop), (P -> Q) -> (Q -> P) -> P = Q.在柯克。这是我的方法。 Inductive True2 : Prop := | O
程序提取数字,我希望它继续循环,直到用户键入“Q”/“q”键。例如,当用户按下“O”键时,程序应打印他们输入的数字的个位数,对于用户输入的任何 3 位数字,依此类推。当我现在运行代码时,没有输出,但也
我收到以下代码的警告,我不明白为什么。 类似于这个问题:Unhandled rejection reasons (should be empty) 但是…… 我很确定我正在处理所有错误,那么为什么会出
我正在使用 Express 构建一个博客站点,并且是第一次使用 Q,我希望能够利用资深 Q 用户的知识。 我向我的数据库发出一个请求以加载帖子数据,另一个请求命中 Instagram API(除非它已
我刚刚找到有关 apache solr 的信息,并且在我成功安装了带有 Tomcat 的 apache Solr 之后。然后我开始使用 Apache Solr 进行搜索。 但我对 Apache Sol
我在 Stack Overflow post 上看到了下图 但是,我对“p OR q”、“p AND q”的结果感到困惑,其中“p”等于“false”,“q”等于“unknown”。 在图中,“p O
有人向我提出了这个问题。 n = 77 n = p*q p and q is a prime number 用蛮力找到p和q。 到目前为止我的代码: public class If { pub
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 4 年前。 Improve
我注意到如果 .then()回调由于任何错误(例如对 undefined variable 的操作)而失败,并且没有 .catch()相关联,该错误将被静默忽略。 这在开发过程中很不舒服。 例如,此代
以下示例打印“SAME”: if (q/\\a/ eq q/\a/) { print "SAME\n"; } else { print "DIFFERENT\n"; } 我理解这与 d
我画了 qq 图多元回归,得到了下面的图。谁能告诉我为什么红线下面有两个点?这些点对我的模型有影响吗? 我使用下面的代码来绘制图表。 from sklearn.linear_model import
我确定 int q[6][4] 中的 q 的类型为 (**q)[4],即, 指向大小为 4 的整数数组的指针。但是我的书(我发现它很可疑!!)说函数定义中的 int q[][4] 部分 void fo
我试图用 tatics [intros]、[apply]、[assumption]、[destruct]、[left]、[right]、[split] 来证明这个引理,但失败了。谁能教教我怎么证明?
使用 q.all 时,我的数组中的立即函数似乎没有执行。每个函数都应该创建一个已解决的 promise ,将其打印到控制台,然后返回它。我没有看到控制台输出,但 Q.all 似乎很满意,并用 2 个空
我想在 OpenAI 的 Bipedal Walker v2 中实现 Q 学习,但在寻找教程后,它们似乎总是有限环境,这使得 Q 矩阵和奖励矩阵易于初始化。 例如:http://mnemstudio.
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在创建一个基于 AngularJS、Breeze 和 RequireJS 的单页应用程序。在使用 requirejs 设置 AMD 以使用 Angular 和 Breeze 时,我遇到了 Bree
这个问题在这里已经有了答案: Difference between defer().promise and Promise (1 个回答) 关闭 6 年前。 在 Angular 中,以下代码片段似乎
我写了一个 tcp 服务器和一个 tcp 客户端,客户端只向服务器发送数据并打印它写入了多少字节,服务器只接受连接,然后我使用 netstat 显示套接字的 Recv-Q 和 Send-问,我发现 R
我是一名优秀的程序员,十分优秀!