Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor,链接方法调用_Javascript_Meteor_Ecmascript 6 - Fatal编程技术网

Javascript Meteor,链接方法调用

Javascript Meteor,链接方法调用,javascript,meteor,ecmascript-6,Javascript,Meteor,Ecmascript 6,我有一个Meteor方法尝试操作数据库,如果成功,则调用一个异步方法。我希望能够调用此方法并返回异步调用的结果或数据库操作的错误 这大致是我在服务器上的代码: Meteor.methods({ 'data.update'(id, data) { Collection.update({id_: id}, {$set: {data: data}}, error => { if (error) { // Have m

我有一个Meteor方法尝试操作数据库,如果成功,则调用一个异步方法。我希望能够调用此方法并返回异步调用的结果或数据库操作的错误

这大致是我在服务器上的代码:

Meteor.methods({
    'data.update'(id, data) {
        Collection.update({id_: id}, {$set: {data: data}}, error => {
            if (error) {
                // Have method return Meteor error for DB-failure
            } else {
                callAsync(id, (error, res) => {
                    if (error) {
                        // Have method return Meteor error for async call failure
                    } else {
                        // Have method return success(res)
                    }
                })
            }
        })
    }
});

我读过关于未来和承诺的书,但我对这些概念还不熟悉,不知道什么时候该用什么。最好我正在寻找一个不依赖Meteor/ES6之外的任何第三方库的解决方案。奖金相关问题:在数据库操作之后,让我将回调附加到一个方法,通常会返回什么?

您可以研究使用承诺,但在Meteor生态系统中,有另一种相当标准的方法来处理类似的事情。可以使用将基于异步回调的函数转换为基于回调的版本。这样就可以利用返回值和异常。下面是一个简单的例子:

1假设我们在某个地方有一个名为increaseLifetimeWidgetCount的内部函数,该函数在某个地方增加数据库中的生存期小部件计数,然后使用错误或新更新的生存期计数调用回调:

function increaseLifetimeWidgetCount(callback) {
  // ...
  // increase the lifetime widget count in the DB somewhere, and 
  // get back the updated widget count, or an error.
  // ...
  const fakeError = null;
  const fakeLifetimeWidgetCount = 1000;
  return callback(fakeError, fakeLifetimeWidgetCount);
}
2假设我们定义了一个简单的方法,该方法将在数据库中创建一个新的小部件,调用我们的内部increaseLifetimeWidgetCount函数,然后返回新更新的生存期小部件计数。由于我们希望返回更新的生存期小部件计数,因此我们将在Meteor.wrapAsync调用中包装基于回调的increaseLifetimeWidgetCount函数,并返回结果:

Meteor.methods({
  newWidget(data) {
    check(data, Object);
    Widgets.insert(data);
    const increaseLifetimeWidgetCountFiber =
      Meteor.wrapAsync(increaseLifetimeWidgetCount);
    const lifetimeWidgetCount = increaseLifetimeWidgetCountFiber();
    return lifetimeWidgetCount;
  }
});
3然后,我们可以通过异步回调从客户端调用newWidget方法,并处理返回的错误或返回的生存期小部件计数:

Meteor.call('newWidget', { 
  name: 'Test Widget 1' 
}, (error, result) => { 
  // Do something with the error or lifetime widget count result ...
  console.log(error, result);
});

你可以考虑使用承诺,但在Meteor生态系统中还有另一种相当标准的方式来处理类似的事情。可以使用将基于异步回调的函数转换为基于回调的版本。这样就可以利用返回值和异常。下面是一个简单的例子:

1假设我们在某个地方有一个名为increaseLifetimeWidgetCount的内部函数,该函数在某个地方增加数据库中的生存期小部件计数,然后使用错误或新更新的生存期计数调用回调:

function increaseLifetimeWidgetCount(callback) {
  // ...
  // increase the lifetime widget count in the DB somewhere, and 
  // get back the updated widget count, or an error.
  // ...
  const fakeError = null;
  const fakeLifetimeWidgetCount = 1000;
  return callback(fakeError, fakeLifetimeWidgetCount);
}
2假设我们定义了一个简单的方法,该方法将在数据库中创建一个新的小部件,调用我们的内部increaseLifetimeWidgetCount函数,然后返回新更新的生存期小部件计数。由于我们希望返回更新的生存期小部件计数,因此我们将在Meteor.wrapAsync调用中包装基于回调的increaseLifetimeWidgetCount函数,并返回结果:

Meteor.methods({
  newWidget(data) {
    check(data, Object);
    Widgets.insert(data);
    const increaseLifetimeWidgetCountFiber =
      Meteor.wrapAsync(increaseLifetimeWidgetCount);
    const lifetimeWidgetCount = increaseLifetimeWidgetCountFiber();
    return lifetimeWidgetCount;
  }
});
3然后,我们可以通过异步回调从客户端调用newWidget方法,并处理返回的错误或返回的生存期小部件计数:

Meteor.call('newWidget', { 
  name: 'Test Widget 1' 
}, (error, result) => { 
  // Do something with the error or lifetime widget count result ...
  console.log(error, result);
});

在服务器上,如果不提供回调,则更新块 直到数据库确认写入,或者在 出了点问题。如果确实提供了回调,则update将返回 立即更新完成后,将使用 失败情况下的单个错误参数,或第二个参数 指示更新失败时受影响文档的数量 成功

因此,如果更新成功,将返回受影响的文档数。如果是insert,则返回插入文档的_id

如前所述,您只需将第三个参数传递给update函数即可

对于promise实现,可以使用Meteor.wrapAsync方法。如果还需要传递实例变量的状态,您可能还需要查看Meteor.bindEnvironment来实现这一点。

根据

在服务器上,如果不提供回调,则更新块 直到数据库确认写入,或者在 出了点问题。如果确实提供了回调,则update将返回 立即更新完成后,将使用 失败情况下的单个错误参数,或第二个参数 指示更新失败时受影响文档的数量 成功

因此,如果更新成功,将返回受影响的文档数。如果是insert,则返回插入文档的_id

如前所述,您只需将第三个参数传递给update函数即可


对于promise实现,可以使用Meteor.wrapAsync方法。如果还需要传递实例变量的状态,您可能还需要查看Meteor.bindEnvironment来实现这一点。

除了术语之外,未来和承诺之间没有区别吗?虽然在JS中我们称之为承诺,是的,你应该返回一个。正如我所说的,我对这些概念还不熟悉。我知道在Scala中它们是不同的,但相关的概念,维基百科说未来和承诺起源于函数编程和相关的paradig
ms,比如逻辑编程,将未来的价值与承诺的计算方式分离。JS中期货和承诺的一大区别是,你只能在谷歌上搜索后者;。是的,在JS中有点奇怪。我们谈论的是延期和承诺,而不是承诺和未来,而且延期正逐渐被淘汰,取而代之的是纯粹的回调。我明白了:。无论如何,如果你对我在这种情况下应该如何使用承诺有一个很好的答案,请随意写一个答案,我会接受的。我对meteor不太了解,所以我恐怕在这里帮不了你。除了术语之外,未来和承诺没有区别?虽然在JS中我们称之为承诺,是的,你应该返回一个。正如我所说的,我对这些概念还不熟悉。我知道,在Scala中,它们是不同但相关的概念,Wikipedia说,未来和承诺起源于函数编程和相关范例,如逻辑编程,将未来的价值与承诺的计算方式分离。JS中期货和承诺的一大区别是,你只能在谷歌上搜索后者;。是的,在JS中有点奇怪。我们谈论的是延期和承诺,而不是承诺和未来,而且延期正逐渐被淘汰,取而代之的是纯粹的回调。我明白了:。无论如何,如果你对我在这种情况下应该如何使用承诺有一个很好的答案,请随意写一个答案,我会接受的。我对meteor不够了解,所以我恐怕在这里帮不了你。