gpt4 book ai didi

Javascript/Sails.js Controller 等待服务调用异步函数

转载 作者:行者123 更新时间:2023-12-03 11:05:20 25 4
gpt4 key购买 nike

使用 asnyc 调用来等待 Javascript 函数完成非常简单,但是似乎不太清楚应该如何处理调用服务的 Controller ,而服务又调用异步函数。

假设我有一个简单的异步方法:

foo.fooMethod( {format: _format, stuff: _stuff },
function( error, response, body )
{
if ( error )
{
sails.log( error );
res.send( "Error " + error, 500 );
}

res.send( body, 200 );

});

在这种情况下,如果我将其放入 Controller 中,我的异步调用将正常工作,因为回调将导致在最终控制函数回调时发送响应。但是,如果我将其放入服务中,我会遇到一个更有趣的问题。

在 MyService 内部,我为 serviceCall 定义了此导出

exports.serviceCall = function(options) {

async.auto(
{
test: function( callback )
{
foo.fooMethod( {format: _format, stuff: _stuff },
function( error, response, body )
{
sails.log("Finished with call");

if ( error )
{
sails.log( error );
callback( error );
//res.send( "Error " + error, 500 );
}

callback( null, body );

//res.send( body, 200 )
});
}
},

function(err, result)
{
sails.log("Returrning");
return result;
}
);

};

问题是,如果我从 Controller 调用它,就会发生明显的情况。 Service 调用将立即返回,因此我无法从 serviceCall 获取响应,以便我可以将此响应发送给用户。由于我不想在 node.js 中阻塞,因此不清楚从 Controller->Service-> 异步方法调用的适当方法是什么。

最佳答案

在 IRC 上的 #sailsjs 上与精彩的社区聊天时,我发现了一个比处理传递回调更好的答案(讨厌那种设计模式)。

var Promise = require('bluebird');

exports.serviceCall = function(options) {

parameters = {
format: options.format,
stuff: options.stuff
}

return new Promise( function( resolve, reject )
{
foo.fooMethod( parameters
function( error, response, body )
{
sails.log("Finished with call");

if ( error )
{
sails.log( error );
throw error;
}
else
{
return resolve(response.results);
}

});
})
};


};

然后可以直接调用它

SomeService.serviceCall(options).then(function(results){

res.json(results);

})

这是使用 sailsjs 执行此类操作的适当设计模式,并且它工作得非常好,并且没有不断传递回调的愚蠢!特别感谢 robdubya 提供的解决方案!!

关于Javascript/Sails.js Controller 等待服务调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27886627/

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