【问题标题】:How do I use DDPClient with promises?如何将 DDPClient 与 Promise 一起使用?
【发布时间】:2014-06-22 18:29:10
【问题描述】:

我正在尝试将when.jsddpclient 一起使用。我写的代码在帖子的底部。当我尝试使用它时,出现以下错误。有关如何解决此错误的任何想法?我知道另一个使用 Promise 的 DDPclient,但我并不热衷于添加额外的 Promise 库。

Potentially unhandled rejection TypeError: Object #<Object> has no method '_nextId'
    at DDPClient.call (/Source/proj/node_modules/ddp/lib/ddp-client.js:329:17)
    at /Source/tellme/updater/node_modules/when/node.js:89:7
    at tryCatchReject (/Source/proj/node_modules/when/lib/makePromise.js:790:14)
    at FulfilledHandler.when (/Source/tellme/updater/node_modules/when/lib/makePromise.js:621:9)
    at ContinuationTask.run (/Source/tellme/updater/node_modules/when/lib/makePromise.js:741:24)
    at Scheduler._drain (/Source/proj/node_modules/when/lib/scheduler.js:56:14)
    at Scheduler.drain (/Source/proj/node_modules/when/lib/scheduler.js:21:9)
    at process._tickCallback (node.js:419:13)
    at Function.Module.runMain (module.js:499:11)
    at startup (node.js:119:16)

代码如下:

"use strict";
var when           = require('when'),
    node           = require('when/node'),
    DDPClient      = require('ddp');


var ddpclient = new DDPClient({
    host: "localhost",
    port: 3000
});

var ddpconnect = node.lift(ddpclient.connect);
var ddpcall = node.lift(ddpclient.call);

//var ddpConnectPromise = node.lift(ddpclient.connect);

var obj = {"name": "john","age":25};

when(ddpconnect).then
(ddpcall("processObj", obj)).
    catch(function (error) {
        console.log(error);
    }).
    done();

编辑:以下似乎让我更接近,但我遇到 [TypeError: Object processObj has no method 'addListener'] 错误。

"use strict";
var when           = require('when'),
    node           = require('when/node'),
    DDPClient      = require('ddp');

var ddpConnectPromise = node.liftAll(DDPClient);

var ddpclient = new ddpConnectPromise({
    host: "localhost",
    port: 3000
});

var obj = {"name": "john","age":25};
when(ddpclient.connect).then(function (ddpclient) {
    ddpclient.call("processObj", sampleJSON);
}).
    catch(function (error) {
        console.log(error);
    }).
    done();

【问题讨论】:

标签: javascript node.js meteor promise when-js


【解决方案1】:

如果你不介意使用bluebird,它有一个promisifyAll 你可以使用:

var Promise = require("bluebird");
Promise.promisifyAll(require("ddp").prototype);
var DDPClient = require("ddp");    

var ddpclient = new DDPClient({
  host: "localhost",
  port: 3000,
  /* optional: */
  auto_reconnect: true,
  auto_reconnect_timer: 500,
  use_ejson: true,           // Use Meteor's EJSON to preserve certain data types.
  use_ssl: false,
  maintain_collections: true // Set to false to maintain your own collections.
});


var obj = {"name": "john","age":25};

ddpclient.connectAsync().then(function(ddpclient) {
    return ddpclient.callAsync("process", {}); // params is a required argument
}).then(function(callResult) {

}); // Logging errors is useless when using bluebird, so leave the .catch out

【讨论】:

  • 我更愿意坚持使用When,但无论如何都尝试了上述方法。但是我遇到了以下错误:TypeError: Object [object Object] has no method 'connectAsync'。 promisifyAll 是否也不适用于原型?
  • 经过几个模组后,我现在有了异步方法。然而,connectAsync 似乎没有返回任何我可以传递给下一个函数的东西。
  • @user1074891 promisifyAll 如答案所示工作,否则您可以使用When.js
  • @user1074891 好像ddp不是直接导出模块而是导出类,我修改了答案
  • 感谢 Esailija 回复我,但是当我使用上面的代码时,我收到了第一条评论中发布的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2016-08-27
  • 2020-06-27
  • 2018-10-24
  • 1970-01-01
  • 2020-06-22
  • 2018-01-14
相关资源
最近更新 更多