Q.ninvoca مع مكتبة Node-Soap التي تقوم بتقييم استدعاء الوظيفة في وقت مبكر جدًا

StackOverflow https://stackoverflow.com//questions/22004331

  •  20-12-2019
  •  | 
  •  

سؤال

أنا أستخدم عقدة الصابون للتكامل مع واجهة برمجة التطبيقات الخارجية القائمة على الصابون.باستخدام هذه المكتبة، يتم إنشاء كائن العميل في وقت التشغيل استنادًا إلى WSDL.لذلك، كائن عميل الصابون غير صالح في وقت التصميم.هذه مشكلة عند محاولة استخدام مكتبة وعد Q.مكتبة Q ملزمة/تقيم استدعاء الأسلوب مبكرًا جدًا، قبل أن يتم تعريفه.إليك مقتطف الكود للتوضيح.

هذا هو رمز العميل باستخدام سلسلة الوعد:

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();
            }
        });
    });
};

هذه هي المشكلة.self.innotasClient.findEntity غير موجود إلا بعد CreateClient()

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)

يعمل هذا الرمز بشكل جيد مع عمليات الاسترجاعات.هل لديك أي فكرة عن كيفية جعل هذا يعمل مع مكتبة الوعد؟

هل كانت مفيدة؟

المحلول

مكتبة Q ملزمة/تقيم استدعاء الأسلوب مبكرًا جدًا، قبل أن يتم تعريفه

لا أنت:

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

هنا أنت تتصل getProject() قبل تمرير نتائجها إلى then طريقة.لكن، then يتوقع أ أتصل مرة أخرى الوظيفة، والتي سيتم استدعاؤها عند حل الوعد.سوف تستخدم

innotas.login(user,pass).then(function(loginresult) {
    innotas.getProjects()
})

إذا كان العميل غير موجود حتى createClient نتائج الطريقة، يجب أن يكون العميل هو نتيجة لهذه الوظيفة - دعها تعيد وعدًا للعميل!

يجب أن يبدو 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