Я пытаюсь понять, почему эти операторы console.log
ведут себя по-разному. Я ожидаю, что они будут вести себя так же:
Использование Node 7. Рассмотрим следующие случаи:
<сильный>1. Promise.resolve(объект)
Promise.resolve
обрабатывает объекты, как я и ожидал:
Promise.resolve({ a: `hello` }).then(console.log) // { a:'hello' }
<сильный>2. Напрямую console.log
экземпляр класса из библиотеки.
Если я храню экземпляр Osmosis, я могу использовать console.log:
const osmosis = require(`osmosis`)
console.log(new osmosis.get(url))
/* { prev:
{ instance: Osmosis:1,
name: 'get',
args: [ 'http://www.google.com', , ],
getURL: [Function: getURLArg],
url: 'http://www.google.com',
params: undefined,
cb: [Function: Get],
next: [Circular] } }
*/
<сильный>3. Promise.resolve(экземпляр класса)
Но если я попытаюсь разрешить экземпляр Osmosis, я не увижу паритета:
Promise.resolve(new osmosis.get(url)).then(console.log) // nothing
Что тут происходит? Я что-то неправильно понимаю в отношении Promise.resolve()
...? Или console.log
?
Почему [3] не ведет журнал так же, как [2], учитывая поведение в [1]?
Контекст. Я не думаю, что мои непосредственные практические цели имеют значение для ответа на этот вопрос. Но вот на всякий случай. Я не понимаю, как что-то в самой библиотеке должно повлиять на вывод окончательного примера. Вот документы по этому new osmosis.get()
: http://rchipka.github.io/node-osmosis/Osmosis.html#toc1__anchor
new osmosis.get(url)
не выполняет асинхронный HTTP-запрос. Он создает экземпляр скребка, который может быть создан с помощью набора декларативных инструкций и указан для «запуска» в произвольное время позже.
Я хочу иметь возможность встроить этот набор инструкций в цепочку обещаний по нескольким причинам.
Основной из них заключается в том, что это был бы самый простой способ разбить определения инструкций на разные функции, которые легче тестировать и понимать. например вместо osmosis.get(url).set({some stuff}).find(@something)
я хотел бы:
function defineSearch(instance){
return instance.set({some stuff})
}
function definePath(instance) {
return instance.find(@something)
}
Promise.resolve(new osmosis.get(url))
.then(defineSearch)
.then(definePath)
.then(instance => instance.run())
Promise.resolve()
? Если вы надеетесь, что он будет ждать, пока не будет выполнена какая-то асинхронная операция, обещания работают не так. В этом случае обертывание вашей операции вPromise.resolve()
на самом деле вам никак не поможет. - person jfriend00   schedule 21.11.2016console.log
создать новый экземпляр, но никогда не увижу экземпляр, переданный черезPromise.resolve
? Это не вопрос обратных вызовов. У меня есть прямой, немедленный, синхронный доступ к экземпляруnew osmosis
вне контекстаPromise.resolve
. - person Joseph Fraley   schedule 21.11.2016osmosis
... может быть,osmosis.get
выдает исключение, поэтому не достигает пунктаthen()
- person Manu   schedule 21.11.2016