【问题标题】:How to call model.find method synchronously in node / loopback?如何在节点/环回中同步调用model.find方法?
【发布时间】:2015-03-26 04:29:54
【问题描述】:

我正在使用自定义模型并尝试使用 find 方法在循环中对其进行过滤。例如下面给出

for i = 0 to n
{
var u = User.find( where { name: 'john'});
}

它不起作用。

另外,如果我使用以下内容

for i = 0 to n
{
User.find( where { name: 'john'}, function(u) {... } );

// How do I call the code for further processing? 
}

有没有办法同步调用 find 方法?请帮忙。

谢谢

【问题讨论】:

标签: javascript node.js rest loopbackjs strongloop


【解决方案1】:

所有这些模型方法(查询/更新数据)都是异步的。没有同步版本。相反,您需要使用作为第二个参数传递的回调函数:

for (var i = 0; i<n; ++i) {
    User.find( {where: { name: 'john'} }, function(err, users) {
        // check for errors first...
        if (err) {
            // handle the error somehow...
            return;
        }

        // this is where you do any further processing...
        // for example:

        if (users[0].lastName === 'smith') { ... }
    } );
}

【讨论】:

  • 很好,您的回答为在循环中使用 model.find() 提供了可能的解释。恕我直言,这仍然是个坏主意。
  • 仍然是异步的。
  • @kz_sergey 查询的是,但不是结果的处理。这就是 OP 所要求的。
【解决方案2】:

您可以使用async package 中的each 函数解决此问题。示例:

async.each(elements, function(element, callback) {
    // - Iterator function: This code will be executed for each element -

    // If there's an error execute the callback with a parameter
    if(error)
    {
        callback('there is an error');
        return;
    }

    // If the process is ok, execute the callback without any parameter
    callback();

}, function(err) {
    // - Callback: this code will be executed when all iterator functions have finished or an error occurs
    if(err)
        console.log("show error");
    else {

        // Your code continues here...
    }

});

这样你的代码是异步的(迭代器函数同时执行)除了回调函数将在所有完成后执行。

您的代码示例如下:

var elements = [1 .. n];

async.each(elements, function(element, callback) {

    User.find( where { name: 'john'}, function(u) {

        if(err)
        {
            callback(err);
            return;
        }

        // Do things ...

        callback();

    });

}, function(err) {

    if(err)
        console.log("show error");
    else {

        // continue processing
    }

});

【讨论】:

  • 这不是答案(没有同步解决方案)。
【解决方案3】:
async myFunction(){
  for(var i = 0; i < n; i++) {
    var u = await User.find( {where { name: 'john'}});
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 2016-03-27
    • 2018-06-24
    • 2017-11-22
    • 2019-08-18
    • 2017-06-30
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多