ClojureScript + momentjs (node.js) завершается ошибкой с .format (dddd, MMMM Do YYYY, h:mm:ss a)

Я пытаюсь показать текущий формат даты и времени для консоли на node.js + clojure, развертывающем momentjs.

js-код рабочего узла:

var moment = require("./lib/moment/moment.js");
console.log(moment().format("dddd, MMMM Do YYYY, h:mm:ss a"));

Вывод консоли:

$ node app1              
Friday, July 5th 2013, 9:57:07 am

Итак, я попробовал код clojureScript, как показано ниже:

(ns rxcljs.core
  (:use [cljs.nodejs :only [require]])
)
(def log #(.log js/console %))
(def moment (require "./lib/moment/moment.js"))

(->> (-> (moment) 
          (.format "dddd, MMMM Do YYYY, h:mm:ss a")
      )
     (log) 
 ) 

Выход консоли становится

$ node app            
FridaynullundefinedJulyundefined5thundefined2013nullundefined9null56null31undefinedam

По какой-то причине Datetime частично представлена ​​связкой null и undefined.

Скомпилированный js-код:

var rxcljs = {core:{}};
rxcljs.core.log = function(a) {
  return console.log(a)
}; 
rxcljs.core.moment = cljs.nodejs.require.call(null, "./lib/moment/moment.js");
rxcljs.core.log.call(null, rxcljs.core.moment.call(null).format("dddd, MMMM Do YYYY, h:mm:ss a"));

Точка, в которой возникла проблема, выглядит не так уж и проблематично:

rxcljs.core.moment.call(null).format("dddd, MMMM Do YYYY, h:mm:ss a")

Есть идеи? Спасибо.


person Community    schedule 05.07.2013    source источник


Ответы (1)


Это связано с известной несовместимостью Moment.js 2.0.0 с ClojureScript, исправленной в этой фиксации автор Дэвид Альтенбург. Вот сообщение коммита:

Функция форматирования теперь использует «instanceof» для переменной, а не «typeof» для вызова этой переменной, чтобы определить, является ли переменная функцией.

Это устраняет несовместимость с ClojureScript, который определяет String.prototype.call как функцию.

Версия в настоящее время в ветке разработки работает нормально.

person Michał Marczyk    schedule 05.07.2013
comment
Спасибо за очень точный отчет. Впечатляющий Михал. - person ; 05.07.2013
comment
К сведению: это включено в выпуск Moment.js 2.1.0. - person Matt Johnson-Pint; 10.07.2013