gpt4 book ai didi

javascript - 我的 promise 是否如期实现?

转载 作者:行者123 更新时间:2023-11-28 15:30:00 27 4
gpt4 key购买 nike

我正在 Parse 的 Cloud Code 中编写一个函数,该函数用 5 张扑克牌填充服务器。这个想法是,服务器应该等到所有 5 张卡都在数据库中,然后再继续执行该功能的下一部分(当前仅向控制台输出一条消息。

我看到的是所有 5 张卡都已添加到数据库中。它们也不一定按顺序出现在数据库中,这使我相信它们是正确异步添加的。在大多数情况下,我的日志记录显示了预期的行为。

I2015-01-03T17:08:01.244Z] Attempting to create cards x5
I2015-01-03T17:08:01.245Z] Attempting to save card0
I2015-01-03T17:08:01.247Z] Attempting to save card1
I2015-01-03T17:08:01.248Z] Attempting to save card2
I2015-01-03T17:08:01.249Z] Attempting to save card3
I2015-01-03T17:08:01.250Z] Attempting to save card4
I2015-01-03T17:08:01.352Z] Card saved:4
I2015-01-03T17:08:01.353Z] Card saved:4
I2015-01-03T17:08:01.354Z] Card saved:4
I2015-01-03T17:08:01.355Z] Card saved:4
I2015-01-03T17:08:01.356Z] Card saved:4
I2015-01-03T17:08:01.357Z] ALL 5 Promises theoretically fulfilled

但是,请注意,当实际保存卡片时,每张卡片的日志都使用相同的编号 - 在本例中为“卡片已保存:4”。

问题是...我的 promise 是否按预期发挥作用?如何修复我的错误以显示已保存的实际卡号?

这是我的代码:

Parse.Cloud.define("populateServer", function(request, response)
{
console.log("Attempting to create cards x5");
var promises = createCards(5);

Parse.Promise.when(promises).then(function(result)
{
console.log("ALL 5 Promises theoretically fulfilled");
});
});

function createCards(qty)
{
var promises = [];

for (i=0;i<qty;i++)
{
var Card = Parse.Object.extend("Card");
var card = new Card();

card.set("name", "test");
card.set("number", i);

console.log("Attempting to save card" +i);

var promise = card.save();

promises.push(promise);

promise.then(function() {
console.log("Card saved:" +i);
}, function(error) {
console.log("Uh oh, something went wrong.");
});
}
return promises;
}

最佳答案

您实际上正在得到您想要的行为,但是i在您的 promise 末尾始终为 4,因为它在任何 then 之前递增。处理程序执行(您的 for 循环是同步的,但处理程序是异步的)。

通常 promise 会传递到 all不是同步解析的,但是因为您正在通过 then 创建链每一个 promise 的执行只有在前一个 promise 完成后才会触发。

旁注:我不太熟悉 Parse 的 Promise 实现,但您可能可以省去创建额外数组并调用 Parse.Promise.when 的麻烦。只需从函数返回 promise 链即可:

function createCards(qty) {
// create a resolved promise that starts the "chain"
// for Parse prommises use Parse.Promise.as();
var promiseChain = Parse.Promise.as();

// start the for loop
for (i=0;i<qty;i++) {
// add another promise onto our chain
// you can `then` or `catch` off of this
// now if you want
promiseChain = promiseChain.then(function () {
// ... any additional logic
card.save();
});
}

return promiseChain;
}

// usage
createCards(5)
.then(function () {
console.log('finished');
});

关于javascript - 我的 promise 是否如期实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27757483/

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