質問

ノードSOAPを使用して、外部SOAPベースのAPIと統合しています。このライブラリでは、クライアントオブジェクトがWSDLに基づいて実行時に作成されます。したがって、SOAPクライアントオブジェクトは設計時には無効です。これはQ Promiseライブラリを使用しようとしている問題です。Qライブラリーは、定義される前に、メソッド呼び出しを早すぎる/評価しています。これが説明するためのコードスニペットです。

Promise Chainを使用したクライアントコード:

innotas.login(user,pass)
.then(innotas.getProjects())
.then(function () {
    console.log('finished');
});
.

これは、正常に機能するログイン()のサービスコードスニペットです。

this.login = function login (user, password) {
    var deferred = q.defer();

    // some stuff here

    return self.createClient()
    .then(function () {
        self.innotasClient.login({ username: self.innotasUser, password: self.innotasPassword }, function(err, res) {
            if (err) {
              console.log('__Error authenticating to service: ', err);
              deferred.reject(err);
            } else {
              self.innotasSessionId = res.return;
              console.log('Authenticated: ', self.innotasSessionId);
              deferred.resolve();
            }
        });
    });
};
.

これは問題です。CreateClient()

の後までSelf.InnotAsClient.Findentityは存在しません。
this.getProjects = function getProjects (request) {

    // initiation and configuration stuff here

    // CALL WEB SERVICE
    self.innotasClient.findEntity(req, function findEntityCallback (err, response) {
      if (err) {
        deferred.reject(err);
      } else {
        deferred.resolve(response);
      }
    })

    return deferred.promise;

    // alternate form using ninvoke
    return q.ninvoke(self.innotasClient, 'findEntity', req).then(function (response) {
        // stuff goes here
    }, function (err) {
        // err stuff goes here
    })
}
.

これはランタイムエラーです:

        self.innotasClient.findEntity(req, function findEntityCallback (err, r
                           ^
TypeError: Cannot call method 'findEntity' of null
    at getProjects (/Users/brad/Workspaces/BFC/InnotasAPI/innotas.js:147:28)
    at Object.<anonymous> (/Users/brad/Workspaces/BFC/InnotasAPI/app.js:13:15)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
.

このコードはコールバックではうまく機能します。Promiseライブラリで動作するためにこれを手に入れようとする方法はありますか?

役に立ちましたか?

解決

Qライブラリは、定義される前に、メソッド呼び出しを早すぎる/評価しています。

いいえ - あなたは:

innotas.login(user,pass)
.then(innotas.getProjects())
.

ここでは、結果をgetProject()メソッドに渡す前にthenを呼び出します。ただし、then callback 関数を想定しています。あなたは

を使うでしょう
innotas.login(user,pass).then(function(loginresult) {
    innotas.getProjects()
})
.

createClientメソッドが生成されるまでクライアントが存在しない場合、クライアントはその関数の result にする必要があります - それがクライアントの約束を返す!

あなたのlibは次のように見えます:

this.login = function login (user, password) {
    // some stuff here
    return self.createClient().then(function(client) {
        return Q.ninvoke(client, "login", {
            username: self.innotasUser,
            password: self.innotasPassword
        }).then(function(res) {
            self.innotasSessionId = res.return;
            console.log('Authenticated: ', self.innotasSessionId);
            return client;
        }, function(err) {
            console.log('__Error authenticating to service: ', err);
            throw err;
        });
    });
};
this.getProjects = function getProjects (client) {
    // initiation and configuration stuff here

    // CALL WEB SERVICE
    return q.ninvoke(client, 'findEntity', req).then(function (response) {
        // stuff goes here
    }, function (err) {
        // err stuff goes here
    });
};
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top