gpt4 book ai didi

node.js - 使用返回 promise 的多个步骤对自定义查找器进行 Sequelize

转载 作者:行者123 更新时间:2023-12-03 22:42:51 24 4
gpt4 key购买 nike

我对 Node 很陌生(不仅仅是一个玩具项目),我正在努力弄清楚如何正确使用 Sequelize。它有一个 promise 驱动的 API,在它返回的 promise 上始终使用“错误”和“成功”方法。

我编写了一个自定义查找器,它涉及三个查询来查找记录,进行原子更新,如果成功,则重新加载记录。

我最初是使用易于理解的回调方法编写的,但是因为它没有与 Sequelize 使用的契约相匹配的契约,所以我想重写它以返回带有成功/错误方法的 Promise。任何指针?看起来 Sequelize 已经采用了 Bluebird 并对其进行了定制,但我不确定是否有一种有意的方式让开发人员自己利用该功能。

/**
* Acquire a build in the 'queued' state and transition it to 'pending'.
*
* @return {Promise}
* a promise for the executed query
*/
Build.acquireQueued = function(callback) {
Build
.find({where: {status:'queued'}})
.success(function(build){
if (!build)
return callback();

Build
.update(
{status:'pending'},
{id:build.id, status:build.status},
{returning:true}
)
.success(function(result){
var affectedRows = result[0];

if (affectedRows == 0)
return callback();

build.reload().success(function(build){
callback(undefined, build);
});
})
.error(callback);
})
.error(callback);
};

我目前必须这样称呼它:
Build.acquireQueued(function(err, build){
// maybe got a build
});

但是因为它看起来不像 Sequelize,所以我希望能够这样称呼它:
Build
.acquireQueued()
.success(function(build){
// definitely got a build
})
.error(function(err){
// splosion!
});

最佳答案

与往常一样,我在发布问题后很快就想通了。您需要使用 Sequelize.Utils.CustomEventEmitter。您给它一个接受 EventEmitter 的函数,然后在完成后调用 emitter.emit('success', things)

/**
* Acquire a job in the 'queued' state and mark it 'pending'.
*
* @return {Promise}
* a promise for the executed query
*/
Build.acquireQueued = function() {
return new db.CustomEventEmitter(function(emitter){
Build
.find({where: {status:'queued'}})
.success(function(build){
if (!build)
return emitter.emit('success');

Build
.update(
{status:'pending'},
{id:build.id, status:build.status},
{returning:true}
)
.success(function(result){
var affectedRows = result[0];

if (affectedRows == 0)
return emitter.emit('success');

// Final return value
build.reload().proxy(emitter);
})
})
})
.run();
};

关于node.js - 使用返回 promise 的多个步骤对自定义查找器进行 Sequelize ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138859/

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