我遇到了调用promises/functions的顺序问题。基本上我获取一个ID数组,然后,对于每个ID,想要获取订单详细信息并保存。然后转到下一个ID。到现在为止,直到每个订单明细都被提取之后,它才会保存。Promises的顺序调用
代码:
// 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
请说明所需的执行顺序是什么。你首先得到一个订单ID列表,然后你必须得到每个细节并将这些细节保存到数据库中。你想要什么操作并行运行,哪个运行顺序?而且,你提到节流 - 你想扼杀什么(通常意味着减慢)?而且,为什么你要在'doCall()'内重新分配'queue',但是从来没有使用过重新分配的变量 - 那是什么意思?而且,延迟的重点是什么?而不是描述你的代码(这对我来说似乎过于复杂),请描述一个你想要的简单规范。 – jfriend00
该队列工作正常 - 每次调用“doCall”应该在队列中运行。期望如上所列。 1)获取ID数组(排队)。 2)对于每个ID轮流进行排队调用以获取详细信息并将详细信息保存到db(虚拟调用)。这不是正在发生的事情。它不会做数据库调用,直到初始数组中的每个条目都已获取细节。 – cyberwombat
对不起,你可能很容易看到你想要的东西,这听起来像是一个迷人的问题来解决,但我真的不明白你想要什么。我希望看到没有提及现有代码的情况下所需确切结果的规范描述。 – jfriend00