javascript - تصدير وحدة العقدة من نتيجة الوعد



node.js coffeescript (2)

يتم تحميل الوحدات النمطية Node.js بشكل متزامن .

يمكنك التعامل مع هذا تصدير قيمة وعد.

#@ your module.js
module.exports = new Promise()

و:

#@ your app.js
const mod = require('./module');

mod.then((value => ...);

أحاول إعادة كتابة وحدة نمطية لإرجاع قيمة مختلفة عن ذي قبل ، لكنها تستخدم الآن مكالمة غير متزامنة للحصول على هذه القيمة. (مع child_process إذا كان يهم). لقد قمت بلفها في وعد ، لكن هذا ليس بالأمر الحاسم بالنسبة لي - يمكن أن يكون ذلك في عملية إعادة الاتصال الأصلية الخاصة بالطفولة ، ولكن المشكلة هي أنني لا أستطيع ربط الوعد في كل مكان في التطبيق لأنني أحتاج إلى أن أصبح هذا متزامنًا. ها هي الوحدة الخاصة بي:

exec = require('child_process').exec

platformHome = process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME']

getExecPath = new Promise (resolve, reject) ->
  path = process.env.GEM_HOME

  if path
    resolve(path)
  else
    exec 'gem environment', (err, stdout, stderr) ->
      unless err
        line = stdout.split(/\r?\n/)
                 .find((l) -> ~l.indexOf('EXECUTABLE DIRECTORY'))
        if line
          resolve line[line.indexOf(': ') + 2..]
        else
          reject undefined

GEM_HOME = undefined

getExecPath.then (path) ->
  GEM_HOME = path
.catch ->
  GEM_HOME = "#{platformHome}/.gem/ruby/2.3.0"
.then =>
  module.exports = GEM_HOME // or simply return it

من الواضح أنه عند طلب الوحدة ، لن ينجح هذا - وإذا module.exports الوعد بنفسه ، then module.exports بعد then - module.exports بي التالية. module.exports هذه السلسلة. كيف يمكنني تجنب هذا النمط؟


يتم تحميل الوحدات النمطية في العقدة التي تقوم بتحميلها مع require() بشكل متزامن ولا يمكن require إرجاع أي قيمة يتم تحميلها بشكل غير متزامن. يمكن أن يعرض وعدًا ولكن بعد ذلك سيتعين على مستخدمي هذه الوحدة النمطية استخدامه على النحو التالي:

require('module-name').then(value => {
  // you have your value here
});

لن يكون من الممكن الكتابة:

var value = require('module-name');
// you cannot have your value here because this line
// will get evaluated before that value is available

بالطبع يمكنك الحصول على الوعد الذي تم حله داخل الوحدة النمطية الخاصة بك وجعلها تقوم بتعيين خاصية على الكائن المصدر عن طريق إضافة شيء مثل هذا:

module.exports = { GEM_HOME: null };

وتغيير:

module.exports = GEM_HOME

إلى:

module.exports.GEM_HOME = GEM_HOME

في هذه الحالة ، كل وحدة أخرى تستخدم هذه الوحدة هي:

var x = require('module-name');

سيكون x.GEM_HOME الأصل على قيمة null ولكن سيتغير في النهاية إلى قيمة صحيحة في وقت لاحق. لن يكون متاحًا على الفور ، لأنه require() عوائد قبل تسوية الوعد وتحديد القيمة.

هناك مناقشة مستمرة لتقديم تحميل وحدة غير متزامن مع بناء جملة ودلالات مختلفة قد تكون مناسبة لحالة الاستخدام الخاصة بك. إنها مواضيع مثيرة للجدل وتستحق قراءة كل الأساس المنطقي وراءها - راجع:

انظر أيضا هذه الإجابة لمزيد من التفاصيل:





coffeescript