gpt4 book ai didi

javascript - 使用 Promise 在 Javascript 中创建 "atomic"代码块

转载 作者:行者123 更新时间:2023-12-03 07:01:31 26 4
gpt4 key购买 nike

来自 Java 背景的我现在正在尝试了解 Javascript 的异步特性。我在代码中使用 Promise 来做到这一点,到目前为止一切都像魅力一样,但现在我有一个概念性问题,即使在多次阅读 Promise/A+ 规范后也没有找到明确的答案。

我的要求是这样的:我有一个方法可以修改共享对象,将更新存储在 PouchDB 中,然后将其读回,以便从数据库中获取更新的修订 ID 字段(乐观锁定)。在 Pouch 中存储和更新数据是异步的(为了简洁起见,我省略了存储“this”来调用 Promise 中的方法):

var _doc = ...;
var _pouch = new PouchDB(...);

function setValue(key, value) {
_doc[key] = value;
_pouch.put(_doc)
.then(function() {
return _pouch.get(_doc._id);
})
.then(function(updatedDoc) {
_doc = updatedDoc;
});
}

现在,我想确保在再次读取 _doc 之前将其写入数据库时​​没有在 _doc 上设置其他键。是否有可能另一个 setValue() 调用正在执行 put() (带有过时的修订 ID),而 Pouch 的 get() 调用尚未执行(考虑到 JS 正在使用的消息队列方法) )和(b)如果可能的话,以下解决方案是故障安全的(它在我的测试中工作,但因为我不知道我的测试是否考虑了所有可能性......;存储“this”再次被省略):

var _doc = ...;
var _pouch = new PouchDB(...);
var _updatePromise;

function setValue(key, value) {
if (_updatePromise == null) {
setValueInternal(key, value);
}
else {
// make sure the previous setValue() call is executed completely before
// starting another one...
_updatePromise.then(function() {
setValueInternal(key, value);
});
}
}

function setValueInternal(key, value) {
_doc[key] = value;

_updatePromise = new Promise(function(done, reject) {
_pouch.put(_doc)
.then(function() {
return _pouch.get(_doc._id);
})
.then(function(updatedDoc) {
_doc = updatedDoc;
_updatePromise = null;
done();
})
catch(function(error) {
_updatePromise = null;
reject(error);
});
});
}

我认为如果履行 promise (调用done())将同步调用下一个then()函数,它应该可以正常工作,但我无法找到是否是这种情况的明确答案。

非常感谢您的任何澄清,并感谢您的帮助。

最佳答案

您尝试在此处执行的链接 promise 确实按预期工作,但我不相信可以保证同步调用 done 。我认为你的代码可以工作,但其中有一些反模式。我建议进行简化以避免显式创建 promise 。

还要考虑一下:如果连续调用 setValue 4 次,那么应该与服务器进行多少次往返?这样做将需要 4 次。您想将它们分批为 1 或 2 吗?

每个 setValue 一次往返:

var _doc = ...;
var _pouch = new PouchDB(...);
var _updatePromise = Promise.resolve();

function setValue(key, value) {
// make sure the previous setValue() call is executed completely before
// starting another one...
_updatePromise = _updatePromise.then(function() {
_doc[key] = value;

return _pouch.put(_doc)
.then(function() {
return _pouch.get(_doc._id);
})
.then(function(updatedDoc) {
_doc = updatedDoc;
});
});
}

关于javascript - 使用 Promise 在 Javascript 中创建 "atomic"代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37034037/

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