【发布时间】:2015-12-22 17:01:29
【问题描述】:
我对调用承诺/函数的顺序有疑问。基本上我获取一个 ID 数组,然后对于每个 ID,想要获取订单详细信息并保存。然后到下一个ID。截至目前,在获取每个订单详细信息之前,它不会保存。
代码:
// Convenience function
var fetchOrders = function() {
return self.fetchOrderList()
.then(function(orders) {
return P.map(orders, function(r) {
return self.fetchOrderById(r.id).then(fn);
});
});
};
// Fetch initial order list
var fetchOrderList = function() {
return new P(function(resolve, reject) {
debug('Fetching initial list');
resolve([{
id: 123
}, {
id: 134
}, {
id: 1333
}]);
});
};
var fetchOrderById = function(id) {
return new P(function(resolve, reject) {
debug('Fetching by ID');
resolve({
foo: 'bar'
});
}).then(function(o) {
debug('Saving');
return o;
})
};
fetchOrders();
预期结果:
Fetching initial list
Fetching by ID
Saving
Fetching by ID
Saving
Fetching by ID
Saving
实际结果
Fetching initial list
Fetching by ID
Fetching by ID
Fetching by ID
Saving
Saving
Saving
【问题讨论】:
-
请描述所需的执行顺序。您首先获得一个 orderID 列表,然后您必须获取每个的详细信息并将该详细信息保存到数据库中。您希望哪些操作并行运行,哪些操作按顺序运行?而且,你提到了节流——你想要节流什么(这通常意味着放慢速度)?而且,你为什么要在
doCall()内部重新分配queue,但从未使用过重新分配的变量——这有什么意义?而且,延迟的意义何在?与其描述你的代码(这对我来说似乎过于复杂),不如描述一个你想要的简单规范。 -
队列工作正常 - 每次调用
doCall都应该通过队列。期望如上所列。 1)获取ID数组(排队)。 2) 依次对每个 id 进行排队呼叫以获取详细信息并将详细信息保存到 db(虚拟呼叫)。这不是正在发生的事情。在初始订单数组中的每个条目都已获取详细信息之前,它不会执行 db 调用。 -
抱歉,您可能很容易看到自己想要什么,而且这听起来像是一个很有趣的问题,但老实说,我不明白您想要什么。我想在不参考现有代码的情况下查看您想要的确切结果的规范描述。
-
@jfriend00 - 全部清理干净 - 队列结果与问题无关。
标签: javascript promise bluebird